【问题标题】:How can I combine these queries?如何组合这些查询?
【发布时间】:2009-06-01 14:44:44
【问题描述】:

我有 5 个查询要一起加入。基本上,他们所做的就是浏览数据库,然后根据租客多久之前的收费来选择租户支付了多少,以及租户欠了多少。

我有四个类别
充电 充电 = 30 天
充电 = 60 天
充电 > 90 天

我知道如何分别获取所有这些值,但是如何将它们汇总在一起,加上租户支付的金额?

以下是我的疑问:
租户已支付的金额

SELECT TransactionCode, TenantID, SUM(Amount) AS Paid FROM tblTransaction
WHERE Amount > 0
GROUP BY TransactionCode, TenantID

收费不到 30 天

SELECT TransactionCode, TenantID, SUM(Amount) AS ChargedCurrent FROM tblTransaction
WHERE Amount < 0 AND TransactionDate > DATEADD("dd", -30, GETDATE())
GROUP BY TransactionCode, TenantID

收费不到 60 天,但超过 29 天

SELECT TransactionCode, TenantID, SUM(Amount) AS ChargedOver30 FROM tblTransaction
WHERE Amount < 0 AND TransactionDate > DATEADD("dd", -60, GETDATE()) AND TransactionDate <= DATEADD("dd", -30, GETDATE())
GROUP BY TransactionCode, TenantID

收费不到 90 天,但超过 59 天

SELECT TransactionCode, TenantID, SUM(Amount) AS ChargedOver60 FROM tblTransaction
WHERE Amount < 0 AND TransactionDate > DATEADD("dd", -90, GETDATE()) AND TransactionDate <= DATEADD("dd", -60, GETDATE())
GROUP BY TransactionCode, TenantID

费用超过 89 天

SELECT TransactionCode, TenantID, SUM(Amount) AS ChargedOver90 FROM tblTransaction
WHERE Amount < 0 AND TransactionDate <= DATEADD("dd", -90, GETDATE())
GROUP BY TransactionCode, TenantID

如何通过一次查询获得所有这些信息?

【问题讨论】:

    标签: sql sql-server-2005-express


    【解决方案1】:

    可以这样做:

    SELECT TransactionCode, TenantID, 
    SUM(CASE WHEN Amount > 0 then Amount ELSE 0 END) AS Paid,
    SUM(CASE WHEN Amount < 0 AND TransactionDate > DATEADD("dd", -30, GETDATE()) THEN Amount ELSE 0 END) AS ChargedCurrent,  
    SUM(CASE WHEN Amount < 0 AND TransactionDate > DATEADD("dd", -60, GETDATE()) AND TransactionDate <= DATEADD("dd", -30, GETDATE()) THEN Amount ELSE 0 END) AS ChargedOver30
    SUM(CASE WHEN Amount < 0 AND TransactionDate > DATEADD("dd", -90, GETDATE()) AND TransactionDate <= DATEADD("dd", -60, GETDATE()) then Amount Else 0 END) AS ChargedOver60,
    SUM(CASE WHEN Amount < 0 AND TransactionDate <= DATEADD("dd", -90, GETDATE()) THEN Amount ELSE 0 END) AS ChargedOver90 
    FROM tblTransaction
    GROUP BY TransactionCode, TenantID
    

    【讨论】:

    • Msg 102, Level 15, State 1, Line 2 ')' 附近的语法不正确。
    • 你需要在 CASE 语句的末尾加上 'END',这是 T-SQL
    • “GROUP BY TransactionCode, TenantID”将为每个 TransactionCode, TenantID 提供一行;我不确定你的意思?
    【解决方案2】:

    使用 UNION 将结果集拼接在一起会起作用。您可能希望使用 PIVOT 功能将其转换为单独的列。抱歉,我不能说得更具体,我没有笔记,而且我不知道这些东西的确切语法。

    【讨论】:

      【解决方案3】:

      这个交叉表查询应该可以工作:

      SELECT 
      Case WHEN Amount > 0 Then Amount Else 0 End as [Total],
      Case WHEN Amount < 0 AND TransactionDate > DATEADD("dd", -30, GETDATE())
          Then Amount Else 0 End as [Charge 0-29 Days],
      Case WHEN Amount < 0 AND TransactionDate > DATEADD("dd", -60, GETDATE()) AND TransactionDate <= DATEADD("dd", -30, GETDATE()) 
          Then Amount Else 0 End as [Charge 30-59 Days],
      Case WHEN Amount < 0 AND TransactionDate > DATEADD("dd", -90, GETDATE()) AND TransactionDate <= DATEADD("dd", -60, GETDATE()) 
          Then Amount Else 0 End as [Charge 60-89 Days],
      Case WHEN Amount < 0 AND TransactionDate <= DATEADD("dd", -90, GETDATE())
           Then Amount Else 0 End as [Charge 90+ Days],
      

      来自 tblTransaction 按事务代码、租户 ID 分组

      【讨论】:

      • 好吧,老鼠,米特打败了我。为什么我没有收到任何更新通知?
      【解决方案4】:

      如果您可以在所有 5 个单独的查询中使查询的投影或形状相同,则可以使用联合不仅将查询组合成一个结果,还可以对结果进行排序。我已经修改了最后一列以保持一致并代表收费的状态,以便您从结果中过滤:

      SELECT TransactionCode, TenantID, SUM(Amount) [Amount], 'Paid' [Status]
      FROM tblTransactionWHERE Amount > 0
      GROUP BY TransactionCode, TenantID
      
      union
      
      SELECT TransactionCode, TenantID, SUM(Amount) [Amount], 'Charged Current' [Status]
      FROM tblTransactionWHERE Amount < 0 AND TransactionDate > DATEADD("dd", -30, GETDATE())
      GROUP BY TransactionCode, TenantID
      
      union
      
      SELECT TransactionCode, TenantID, SUM(Amount) [Amount], 'ChargedOver30' [Status]
      FROM tblTransactionWHERE Amount < 0 AND TransactionDate > DATEADD("dd", -60, GETDATE()) AND TransactionDate <= DATEADD("dd", -30, GETDATE())
      GROUP BY TransactionCode, TenantID
      
      union
      
      SELECT TransactionCode, TenantID, SUM(Amount) [Amount], 'ChargedOver60' [Status]
      FROM tblTransactionWHERE Amount < 0 AND TransactionDate > DATEADD("dd", -90, GETDATE()) AND TransactionDate <= DATEADD("dd", -60, GETDATE())
      GROUP BY TransactionCode, TenantID
      
      union
      
      SELECT TransactionCode, TenantID, SUM(Amount) [Amount], 'ChargedOver90' [Status]
      FROM tblTransactionWHERE Amount < 0 AND TransactionDate <= DATEADD("dd", -90, GETDATE())
      GROUP BY TransactionCode, TenantID
      
      order by 4 --Status
      

      【讨论】:

      • 有没有办法将它们全部放在一行中,而不是分散在 5 行中?
      【解决方案5】:

      为每个查询添加一个额外的列

      SELECT TransactionCode, TenantID, SUM(Amount) AS ChargedCurrent, 30 as [DaysLate] FROM tblTransaction...

      然后将所有查询联合起来

      【讨论】:

        猜你喜欢
        • 2017-02-28
        • 2017-03-13
        • 1970-01-01
        • 1970-01-01
        • 2022-01-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多