sql中组合的组、求和和和联接
我有一个表sql中组合的组、求和和和联接,sql,join,group-by,Sql,Join,Group By,我有一个表消费,其中包含一些基本字段,这些字段定义了购买项目、购买时间和购买价值,以及购买它们的帐户:spItem、spAmount、spDate和spAccount 我每月对他们进行一次一个账户的分组查询,效果很好: SELECT YEAR(spDate) as spYear, MONTH(spDate) as spMonth, SUM(spAmount) AS TotalAmount FROM spending WHERE spAccount like 'Bank
消费
,其中包含一些基本字段,这些字段定义了购买项目、购买时间和购买价值,以及购买它们的帐户: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)
及
我试图得到一个表,它可以将两个查询组合起来,并将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)
对于每个可用的月份和年份(其中至少有一个帐户中存在数据),显示每个帐户的总和(即使其中一个帐户为0)。
为此,我加入了两个查询,并使用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)
;
谢谢我试图运行查询,但得到以下语句:“您编写的子查询可以返回多个字段,而不需要在主查询的FROM子句中使用EXISTS保留字。请修改子查询的SELECT语句,使其仅请求一个字段。”谢谢:)现在一个弹出窗口显示“此子查询最多可以返回一条记录”
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)
;