【问题标题】:SQL How to combine 2 queries into oneSQL 如何将 2 个查询合二为一
【发布时间】:2012-08-13 10:42:15
【问题描述】:

我有 2 个查询返回与贸易债务人有关的结果。第一个为所有贸易债务人每月返回金额,而第二个为所有贸易债务人在 30 天后每月返回金额。

第一次查询

SELECT  T2.Name AS Period, 
        SUM(T1.LineTotal) AS CurrentAmount, 
        MAX(T0.DocRate) AS ExchangeRate 
FROM    OINV T0 INNER JOIN 
        INV1 T1 ON T0.DocEntry = T1.DocEntry  INNER JOIN 
        dbo.OFPR AS t2 ON T1.FinncPriod = T2.AbsEntry  
WHERE   T0.DocStatus = 'O' AND t0.DocDate BETWEEN '2007-01-01' AND '2007-12-01'
GROUP BY    T2.Name

第二次查询

SELECT  T2.Name AS Period, 
        SUM(T1.LineTotal) AS NonCurrentAmount,         
        MAX(T0.DocRate) AS ExchangeRate 
FROM    OINV T0 INNER JOIN 
        INV1 T1 ON T0.DocEntry = T1.DocEntry  INNER JOIN 
        dbo.OFPR AS t2 ON T1.FinncPriod = T2.AbsEntry  
WHERE   T0.DocStatus = 'O' AND DATEDIFF(day,t0.DocDate,t0.DocDueDate)>30 
        AND t0.DocDate BETWEEN '2007-01-01' AND '2007-12-01' 
GROUP BY    T2.Name

如何将上述 2 个查询合并为一个,以使生成的查询返回 4 列中的结果; Period, CurrentAmount, NonCurrentAmount and exchange rate.

【问题讨论】:

    标签: sql sql-server-2008


    【解决方案1】:

    您可以将where 子句中的差异移至case 语句:

    SELECT  T2.Name AS Period, 
            SUM(T1.LineTotal) AS CurrentAmount, 
            MAX(T0.DocRate) AS ExchangeRate1, 
            SUM(case when DATEDIFF(day,t0.DocDate,t0.DocDueDate) > 30
                then T1.LineTotal end) AS NonCurrentAmount,         
            MAX(case when DATEDIFF(day,t0.DocDate,t0.DocDueDate) > 30
                then T0.DocRate end) AS ExchangeRate2
    FROM    OINV T0
    JOIN    INV1 T1 
    ON      T0.DocEntry = T1.DocEntry 
    JOIN    dbo.OFPR AS t2 ON T1.FinncPriod = T2.AbsEntry  
    WHERE   T0.DocStatus = 'O'
            AND t0.DocDate BETWEEN '2007-01-01' AND '2007-12-01'
    GROUP BY
            T2.Name
    

    【讨论】:

    • +1 :除此之外,我会将 t0.DocDate BETWEEN '2007-01-01' AND '2007-12-01' 留在 WHERE 子句中,因为它适用于两个查询。第一个 SUM() 和 MAX() 将不需要 CASE 语句。
    • 非常感谢 Andomar 和 Dems。
    猜你喜欢
    • 1970-01-01
    • 2022-06-10
    • 1970-01-01
    • 1970-01-01
    • 2018-04-14
    • 2023-03-21
    • 2014-06-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多