【问题标题】:Adjust the where statement based on the columns根据列调整where语句
【发布时间】:2020-01-28 07:43:58
【问题描述】:

我有一个这样的查询,我需要根据列来调整我的where语句,请看下面的查询:

SELECT 
    b.id as [ID]
    ,d.[Title] as [Title]
    ,e.Class as [Class]

    ,Sum(a.col1) as [Last 30 Days Col1]
    ,Sum(a.col2) as [Last 30 Days Col2]

    ,Sum(a.col1) as [Last 90 Days Col1]
    ,Sum(a.col2) as [Last 90 Days Col2]

    ,Sum(a.col1) as [Last 365 Days Col1]
    ,Sum(a.col2) as [Last 365 Days Col2]
FROM 
    tb1 a
INNER JOIN 
    tb2 b -- ON anything
INNER JOIN 
    tb3 c -- ON anything
INNER JOIN       
    tb4 d -- ON anything
INNER JOIN 
    tb5 e -- ON anything
WHERE
    a.DateCol >= DATEADD(MONTH, -1, GETDATE())
GROUP BY
    b.id, d.Title, e.Class

我目前得到的结果是这样的:

时间:

其中 a.DateCol >= DATEADD(MONTH,-1,GETDATE()) => 过去 30 天 Col1 = 过去 90 天 Col1 = 过去 365 天 Col1 = 10

时间:

其中 a.DateCol >= DATEADD(QUARTER,-1,GETDATE()) => 过去 30 天 Col1 = 过去 90 天 Col1 = 过去 365 天 Col1 = 100

时间:

其中 a.DateCol >= DATEADD(YEAR,-1,GETDATE()) => 过去 30 天 Col1 = 最后 90 天 Col1 = 过去 365 天 Col1 = 1000

ID | Title |  Class | Last 30 Days Col1 | Last 30 Days Col2 | Last 90 Days Col1 | Last 90 Days Col2 | Last 365 Days Col1 | Last 365 Days Col2
  --------------------------------------------------------------------------------------------------------------------------------------
1 | T1    |  C1    |        10         |         20        |         10        |         20        |         10          |        20

但正如您所猜测的,我需要每列显示正确的值,我不知道如何更改我的查询来实现这一点,因为我有一个固定的 where 语句。关于如何根据 30,90 和 365 天调整 where 语句并相应地在正确列中显示正确值的任何想法?

【问题讨论】:

  • 您已将条件放入 sum 而不是 where 子句,例如: sum(CASE WHEN a.DateCol >= DATEADD(MONTH,-1,GETDATE()) THEN a.col1 ELSE 0 END) 类似下一列
  • @SundarSingh 感谢您的解决方案按预期工作。请您发布一个答案以便我接受吗?

标签: sql sql-server


【解决方案1】:

首先,条件应过滤去年where a.DateCol >= DATEADD(YEAR, -1, GETDATE()) 的所有记录,然后在 Sum 函数中,将天数差异设置为条件:

SELECT b.id AS [ID]
    ,d.[Title] AS [Title]
    ,e.Class AS [Class]
    ,Sum(WHERE datediff(day, a.DateCol, getdate()) <= 30 then a.Col1 ELSE 0 END) AS [Last 30 Days Col1]
    ,Sum(WHERE datediff(day, a.DateCol, getdate()) <= 30 then a.col2 ELSE 0 END) AS [Last 30 Days Col2]
    ,Sum(WHERE datediff(day, a.DateCol, getdate()) <= 90 then a.Col1 ELSE 0 END) AS [Last 90 Days Col1]
    ,Sum(WHERE datediff(day, a.DateCol, getdate()) <= 90 then a.col2 ELSE 0 END) AS [Last 90 Days Col2]
    ,Sum(WHERE datediff(day, a.DateCol, getdate()) <= 365 then a.Col1 ELSE 0 END) AS [Last 365 Days Col1]
    ,Sum(WHERE datediff(day, a.DateCol, getdate()) <= 356 then a.col2 ELSE 0 END) AS [Last 365 Days Col2]
FROM tb1 a
INNER JOIN tb2 b -- ON anything
INNER JOIN tb3 c -- ON anything
INNER JOIN tb4 d -- ON anything
INNER JOIN tb5 e -- ON anything
WHERE a.DateCol >= DATEADD(YEAR, - 1, GETDATE())
GROUP BY b.id
    ,d.Title
    ,e.Class

【讨论】:

  • 谢谢,似乎从 where 子句中删除条件并将其放在列中可以正常工作,就像 @SundarSingh 所说的那样。
  • 条件在where语句中是可以的,因为可能有数百万条超过365天的记录,所以先过滤再应用in-Sum条件是合理的
  • 所以你的意思是这种方式效率更高?
  • @Jim 是的,这很有意义并过滤了过去 1 年的记录。
猜你喜欢
  • 2013-01-01
  • 2021-04-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-02-17
  • 2012-02-29
相关资源
最近更新 更多