簡體   English   中英

組,總和和聯接在SQL組合

[英]group, sum and join combined in sql

我有一個表spending ,其中包含一些基本字段,這些字段定義了購買的項目,購買的時間和購買的價值,以及它們從哪個帳戶購買: spItemspAmountspDatespAccount

我進行了查詢,將它們每月分組,一次一個帳戶,效果很好:

SELECT YEAR(spDate) as spYear,
       MONTH(spDate) as spMonth,
       SUM(spAmount) AS TotalAmount
FROM spending
WHERE spAccount like 'Bank1'
GROUP BY YEAR(spDate), MONTH(spDate)
ORDER BY YEAR(spDate), MONTH(spDate)

SELECT YEAR(spDate) as spYear,
       MONTH(spDate) as spMonth,
       SUM(spAmount) AS TotalAmount
FROM spending
WHERE spAccount like 'Bank2'
GROUP BY YEAR(spDate), MONTH(spDate)
ORDER BY YEAR(spDate), MONTH(spDate)

我正在嘗試獲得一個可以合並兩個查詢的表,並將Bank1顯示為一列,而Bank2為下一列。 在某些月份中,其中一個帳戶可能沒有任何支出。 在這種情況下,它應該顯示一個零值,而不僅僅是跳過它。

任何能以正確的方式指出我的人將不勝感激。

在將年和月組合為一個字段的日期上進行選擇,以進行相應的排序和分組。 另外,請確保首先對帳戶進行分組,因為SQL中的分組順序很重要。

SELECT YEAR(spDate) as spYear, MONTH(spDate) as spMonth, SUM(spAmount) AS TotalAmount,(SELECT SUM(spAmount) AS TotalAmount2 FROM spending WHERE spAccount like 'Bank2' GROUP BY YEAR(spDate), MONTH(spDate) ORDER BY YEAR(spDate), MONTH(spDate)) FROM spending WHERE spAccount like 'Bank1' GROUP BY YEAR(spDate), MONTH(spDate) ORDER BY YEAR(spDate), MONTH(spDate)

希望我能正確理解您的問題:-)

對於每個可用的月份和年份(其中至少一個帳戶中存在數據),顯示每個帳戶的SUM(即使其中一個為0)。 為此,我加入了2個查詢,並使用ISNULL函數從正確的源獲取數據。

這是我的虛擬數據解決方案:

--Preparing Dummy Data
;WITH spending
 AS (SELECT '01-01-2010' spDate, 
            100          spamount, 
            'Bank1'      spaccount 
     UNION 
     SELECT '01-01-2010' spDate, 
            200          spamount, 
            'Bank1'      spaccount 
     UNION 
     SELECT '03-01-2010' spDate, 
            150          spamount, 
            'Bank1'      spaccount 
     UNION 
     SELECT '04-01-2010' spDate, 
            500          spamount, 
            'Bank1'      spaccount 
     UNION 
     SELECT '01-01-2010' spDate, 
            200          spamount, 
            'Bank1'      spaccount 
     UNION 
     SELECT '03-01-2010' spDate, 
            10           spamount, 
            'Bank2'      spaccount 
     UNION 
     SELECT '05-01-2010' spDate, 
            800          spamount, 
            'Bank2'      spaccount 
     UNION 
     SELECT '03-01-2010' spDate, 
            110          spamount, 
            'Bank2'      spaccount 
     UNION 
     SELECT '01-01-2010' spDate, 
            100          spamount, 
            'Bank2'      spaccount) 
--End of Dummy Data

--Start Query on Dummy Data
SELECT ISNULL(Bank1.SPMONTH, Bank2.SPMONTH) AS spMonth, 
       ISNULL(Bank1.SPYEAR, Bank2.SPYEAR)   AS spYear, 
       ISNULL(Bank1.TOTALAMOUNT, 0)         AS TotalAmount_Bank1, 
       ISNULL(Bank2.TOTALAMOUNT, 0)         AS TotalAmount_Bank2 
FROM   (SELECT YEAR(SPDATE)  AS spYear, 
               MONTH(SPDATE) AS spMonth, 
               SUM(SPAMOUNT) AS TotalAmount 
        FROM   spending 
        WHERE  SPACCOUNT LIKE 'Bank1' 
        GROUP  BY YEAR(SPDATE), 
                  MONTH(SPDATE)) AS Bank1 
       FULL JOIN (SELECT YEAR(SPDATE)  AS spYear, 
                         MONTH(SPDATE) AS spMonth, 
                         SUM(SPAMOUNT) AS TotalAmount 
                  FROM   spending 
                  WHERE  SPACCOUNT LIKE 'Bank2' 
                  GROUP  BY YEAR(SPDATE), 
                            MONTH(SPDATE)) AS Bank2 
              ON Bank1.SPMONTH = Bank2.SPMONTH 
                 AND Bank2.SPYEAR = Bank2.SPYEAR 
ORDER  BY SPYEAR, 
          SPMONTH 

您可以將分組與條件匯總一起使用,以在一個查詢中獲得兩個帳戶的總計。 如下所示:

SELECT YEAR(spDate) as spYear,
       MONTH(spDate) as spMonth,
       SUM(CASE spAccount WHEN 'Bank1' THEN spAmount ELSE 0 END) AS Bank1,
       SUM(CASE spAccount WHEN 'Bank2' THEN spAmount ELSE 0 END) AS Bank2
FROM spending
WHERE spAccount IN ('Bank1', 'Bank2')
GROUP BY YEAR(spDate), MONTH(spDate)
ORDER BY YEAR(spDate), MONTH(spDate)
;

暫無
暫無

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

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