Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
sql中组合的组、求和和和联接_Sql_Join_Group By - Fatal编程技术网

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)
;