[英]group, sum and join combined in sql
我有一個表spending
,其中包含一些基本字段,這些字段定義了購買的項目,購買的時間和購買的價值,以及它們從哪個帳戶購買: spItem
, spAmount
, spDate
和spAccount
。
我進行了查詢,將它們每月分組,一次一個帳戶,效果很好:
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.