簡體   English   中英

如何在do列中按日期划分分組數據

[英]How can I divide grouped data by date in do columns

我有一個數據集,我想按一個客戶代碼分組,對於每個代碼,我希望對一個月的日期之間的交易總數求和,並使每個月成為一個單獨的列。 我可以使這種動態變化成為我的主要關注點,即構造初始選擇以按需要輸出數據。

我有的:

SELECT [cmasterno]
    ,CASE 
        WHEN Month([dtrs]) = 1
            AND Year([dtrs]) = YEAR(GETDATE())
            THEN SUM([nftrsamt])
        END AS 'Jan 2014'
    ,CASE 
        WHEN Month([dtrs]) = 2
            AND Year([dtrs]) = YEAR(GETDATE())
            THEN SUM([nftrsamt])
        END AS 'Feb 2014'
FROM [AccountMate].[dbo].[gltrsn]
WHERE csource LIKE 'AR'
    AND cacctid LIKE '%4220%'
GROUP BY cmasterno

數據樣本將是

cmasterno   dtrs    ntrsamt
CEN01-A    1/24/2014    -22.2
AUT129-A    2/24/2014   -0.84
CEN01-A    1/22/2014    -19.86
CEN01-A    2/22/2014    -13.2
AUT129-A    1/22/2014   -18.42
AUT129-A    1/22/2014   -1
AUT129-A    2/22/2014   -316.56
CEN01-A    2/21/2014    -2.04

使用條件SUM

SELECT [cmasterno],
       SUM (CASE 
               WHEN Month([dtrs]) = 1 AND Year([dtrs]) = YEAR(GETDATE())
                    THEN [nftrsamt]
               ELSE 0
            END
           ) AS 'Jan 2014',
       SUM (CASE 
               WHEN Month([dtrs]) = 2 AND Year([dtrs]) = YEAR(GETDATE())
                    THEN [nftrsamt]
               ELSE 0
            END
           ) AS 'Feb 2014'
FROM [AccountMate].[dbo].[gltrsn]
WHERE csource LIKE 'AR'
    AND cacctid LIKE '%4220%'
GROUP BY cmasterno

為了完整起見,您也可以使用聯接來完成此操作

SELECT [cmasterno], sum(jan.nftrsamt) as 'Jan 2014', sum(feb.nftrsamt) as 'Feb 2014'
FROM [AccountMate].[dbo].[gltrsn] b
LEFT JOIN [AccountMate].[dbo].[gltrsn] jan on b.cacctid = jan.cacctid and Month(jan.[dtrs]) = 1 AND Year(jan.[dtrs]) = YEAR(GETDATE())
LEFT JOIN [AccountMate].[dbo].[gltrsn] feb on b.cacctid = feb.cacctid and Month(feb.[dtrs]) = 2 AND Year(feb.[dtrs]) = YEAR(GETDATE())
WHERE csource LIKE 'AR' AND cacctid LIKE '%4220%'
GROUP BY cmasterno

根據您的索引,聯接可能比情況快得多。 那是O(1)而不是O(N)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM