【问题标题】:SQL - CASE WHEN querySQL - CASE WHEN 查询
【发布时间】:2017-05-30 18:37:28
【问题描述】:

我正在尝试从我的表格中获取为过去 12 个月期间花费超过 1000 的客户开具的所有发票。下面是我的表格,仅供两个客户使用:

我的查询:

SELECT 
    t.Customer, t.Invoice 
FROM 
    (SELECT
         CI.Customer, CI.Invoice, CI.Date,
         SUM(CASE 
                WHEN CI.Date > DATEADD(month, -12, getdate()) 
                   THEN CI.Valuee 
                ELSE 0 
             END) as Net
     FROM 
         CustomerInvoice CI
     GROUP BY 
         CI.Customer, CISRV.Invoice, CISRV.Date) AS t
GROUP BY 
    t.Customer, t.Invoice
HAVING 
   SUM (t.Net) > 1000

因此,我只会收到发票 INV-341453,但我还想显示发票 INV-346218 和 INV-349065。

我做错了什么?

【问题讨论】:

    标签: sql sum case having


    【解决方案1】:

    您可以使用分组查询来识别超过 1000 个阈值的客户,然后显示这些客户的所有发票:

    SELECT Customer, Invoice 
     FROM CustomerInvoice 
     WHERE Customer IN 
         (SELECT Customer 
         FROM CustomerInvoice
         GROUP BY Customer
         HAVING SUM(CASE WHEN CI.Date>DATEADD(month,-12,getdate()) THEN CI.Valuee ELSE 0 END) > 1000)
    

    【讨论】:

      【解决方案2】:

      使用 ANSI 标准窗口函数:

      select ci.*
      from (select ci.*,
                   sum(ci.value) over (partition by ci.customer) as total_value
            from CustomerInvoice CI
            where CI.Date > DATEADD(month, -12, getdate())
           ) ci
      where total_value > 1000;
      

      “所有发票”是指过去 12 个月内的发票。

      【讨论】:

      • 谢谢 Gordon 成功了!非常好的解决方案和简单的代码。将了解有关 OVER 子句的更多信息..
      猜你喜欢
      • 2017-08-15
      • 1970-01-01
      • 1970-01-01
      • 2016-02-23
      • 2014-11-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多