【问题标题】:select multiple sum how to filter by date correctly选择多个总和如何正确按日期过滤
【发布时间】:2012-10-02 14:17:18
【问题描述】:

这是我目前没有按 createdDate 过滤任何内容的内容。

SELECT [employeeID]
      ,employeeName
      ,isnull((SELECT SUM(case when clientID != 10 then timeSpent else 0 end)),0) as 'billable'

      ,isnull((SELECT SUM(case when clientID = 10 then timeSpent else 0 end)),0) as 'nonBillable'
FROM [myDB].[dbo].[myTable]
group by employeeID,employeeName

哪个输出:

employeeID employeeName billable nonbillable
---------- ------------ -------- -----------
1          tom          5230     2302
2          dick         25       8439
3          harry        2430     9433

准确的输出将是相似的,但值的总和仅在日期范围内:

employeeID employeeName billable nonbillable
---------- ------------ -------- -----------
1          tom          35       5
2          dick         25       15
3          harry        2        48

[myTable] 有以下字段:employeeID,employeeName,clientID,timeSpent,createdDate

我需要能够在每个 select sum 语句中添加一个过滤器,类似于以下内容:WHERE createdDate BETWEEN ('2012-10-01') AND ('2012-10-07')

以下变体均因 SQL 错误或输出不准确而失败:

SELECT [employeeID]
      ,employeeName
      ,isnull((SELECT SUM(case when clientID != 10 then timeSpent else 0 end)),0) as 'billable'
      ,isnull((SELECT SUM(case when clientID = 10 then timeSpent else 0 end)),0) as 'nonBillable'
FROM [myDB].[dbo].[myTable]
WHERE createdDate BETWEEN ('2012-10-01') AND ('2012-10-07')
group by employeeID,employeeName

SELECT DISTINCT [employeeID]
      ,employeeName
      ,isnull((SELECT SUM(case when clientID != 10 then timeSpent else 0 end)),0) as 'billable'
      ,isnull((SELECT SUM(case when clientID = 10 then timeSpent else 0 end)),0) as 'nonBillable'
FROM [myDB].[dbo].[myTable]
WHERE createdDate BETWEEN ('2012-10-01') AND ('2012-10-07')
group by employeeID,employeeName

SELECT [employeeID]
      ,employeeName
      ,isnull((SELECT SUM(case when clientID != 10 then timeSpent else 0 end)WHERE createdDate BETWEEN ('2012-10-01') AND ('2012-10-07')),0) as 'billable'
      ,isnull((SELECT SUM(case when clientID = 10 then timeSpent else 0 end)WHERE createdDate BETWEEN ('2012-10-01') AND ('2012-10-07')),0) as 'nonBillable'
FROM [myDB].[dbo].[myTable]
group by employeeID,employeeName,createdDate

任何帮助将不胜感激。

提前致谢。

【问题讨论】:

  • 您应该指定 SQL 平台 - 这看起来像 SQL Server?

标签: sql date select sum between


【解决方案1】:

第一个查询应该会给你正确的结果

SELECT [employeeID] 
      ,employeeName 
      ,isnull((SELECT SUM(case when clientID != 10 then timeSpent else 0 end)),0) as 'billable' 
      ,isnull((SELECT SUM(case when clientID = 10 then timeSpent else 0 end)),0) as 'nonBillable' 
FROM [myDB].[dbo].[myTable] 
WHERE createdDate BETWEEN '2012-10-01' AND '2012-10-07'
group by employeeID,employeeName 

但是,如果 createdDate 是日期时间类型,则它只会返回 '2012-01-01 00:00' 和 '2012-10-07 00:00' 之间的值 - 2012-10-07 之后没有任何值00:01。理想情况下,您可以将过滤日期指定为日期,而不是字符串。

【讨论】:

  • 你是对的。在发布问题之前运行它时,我一定有一些不同的东西。谢谢。
猜你喜欢
  • 1970-01-01
  • 2021-11-26
  • 2010-10-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-31
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多