在 2 个不同的列 sql 中获取 2 个不同日期的数据

Posted

技术标签:

【中文标题】在 2 个不同的列 sql 中获取 2 个不同日期的数据【英文标题】:Get data of 2 different dates in 2 different columns sql 【发布时间】:2021-04-21 13:38:05 【问题描述】:

我有一个 sql 表,其中包含 Name、VisitingDate、StayTime 列 我想要一个查询,它可以给我数据,其中 1 列我可以得到 thismonthvisit 的数据,其他列我可以得到 lastmonthvisit 的数据,在第 3 列我可以得到特定人的逗留时间总和的数据。

数据库表:--

Name VisitingDate StayTime(in minutes)
A 2021-04-20 5
A 2021-04-21 15
A 2021-03-20 10
B 2021-03-20 5

想要的结果:--

Name Thismonthvisit TotalStayTimeThismonth(in minutes) LastmonthVisit TotalStayTimelastmonth(in minutes)
A 2 20 1 10
B 0 0 1 5

【问题讨论】:

【参考方案1】:

这就是你要找的东西:

select name,
SUM(CASE WHEN FORMAT(VisitingDate, 'YYYYMM') = FORMAT(getdate(),'YYYYMM') THEN 1 ELSE 0 END) AS ThisMonthVisit,
SUM(CASE WHEN FORMAT(VisitingDate, 'YYYYMM') = FORMAT(getdate(),'YYYYMM') THEN StayTime ELSE 0 END) AS TotalStayTimeThisMonth,
SUM(CASE WHEN FORMAT(VisitingDate, 'YYYYMM') = FORMAT(dateadd(month, -1, getdate()),'YYYYMM') THEN 1 ELSE 0 END) AS LastMonthVisit,
SUM(CASE WHEN FORMAT(VisitingDate, 'YYYYMM') = FORMAT(dateadd(month, -1, getdate()),'YYYYMM') THEN StayTime ELSE 0 END) AS TotalStayTimeLastMonth
from MyTable
where FORMAT(VisitingDate, 'YYYYMM') > FORMAT(dateadd(month, -2, getdate()),'YYYYMM')
group by Name

SEE DEMO HERE

【讨论】:

【参考方案2】:

你可以使用聚合:

select name,
       sum(case when month(visitingdate) = month(getdate())
                then 1 else 0
           end) as cnt_thismonth,
       sum(case when month(visitingdate) = month(getdate())
                then staytime else 0
           end) staytime_thismonth,
       sum(case when month(visitingdate) <> month(getdate())
                then 1 else 0
           end) as cnt_lastmonth,
       sum(case when month(visitingdate) <> month(getdate())
                then staytime else 0
           end) staytime_lastmonth
from t
where visitingdate >= dateadd(month, -1, datefromparts(year(getdate()), month(getdate()), 1))
group by name;
   

【讨论】:

以上是关于在 2 个不同的列 sql 中获取 2 个不同日期的数据的主要内容,如果未能解决你的问题,请参考以下文章

如何根据 3 个不同的列在 mysql 中选择行

在新日期vue.js中获取2个不同日期之间的所有日期[重复]

sql 从2个不同的表中选择唯一的电子邮件,并按日期排序。

如何获得 2 个不同 WHERE 子句的列的平均值?

在 Sqlite 中,为不同列中返回的每个名称获取前 2 个

多个语句的 SQL 多次计数赢得不同的列