首页 > 解决方案 > 当涉及 SUM 的多个 case 语句时,如何组合以下 2 个 sql 查询

问题描述

这是第一个子查询:

SELECT SUM(CASE WHEN TRADE_TYPE='SELL' THEN (QUANTITY*PRICE) END)  -
       SUM(CASE WHEN TRADE_TYPE='BUY' THEN (QUANTITY*PRICE) END) AS NET_PL, TRADINGSYMBOL AS STOCK_NAME    
       FROM dbo.[Table1]
       GROUP BY TRADINGSYMBOL, TRADE_DATE

这是第二个子查询:

SELECT SUM(CASE WHEN TRADE_TYPE='BUY' THEN QUANTITY END) - 
       SUM(CASE WHEN TRADE_TYPE='SELL' THEN QUANTITY END) AS NET_QUANTITY, TRADINGSYMBOL AS STOCK_NAME
       FROM  dbo.[Table1]
       GROUP BY TRADINGSYMBOL

这是第二个子查询的查询结果:

NET_QUANTITY           STOCK_NAME
---------------------- --------------------------------------------------
NULL                   ABCL
0                      ADAT
NULL                   BAF
NULL                   BEGE
0                      CRECC
NULL                   CIEN
NULL                   DFMXA
NULL                   DFJL
-50                    HDANK
1000                   MEHD
NULL                   PRAK
0                      TNTS

作为第二个查询结果 WITH NET QUANTITY 0 的一部分存在的每个 TRADINGSYMBOL 必须与第一个查询结果组合/合并。我的意思是除了 query-1 中包含的 TRADINGSYMBOL(s) 之外,query-2 TRADING SYMBOLS 还必须针对它们的 (QUANTITY*PRICE) 进行计算,并且应该是最终输出的一部分。

请指导我。谢谢你。

标签: sql-servercase

解决方案


一种快速简便的方法是将它们视为两个子查询。

SELECT
    PL.STOCK_NAME
    ,PL.NET_PL
    ,Q.NET_QUANTITY
FROM
    (SELECT SUM(CASE WHEN TRADE_TYPE='SELL' THEN (QUANTITY*PRICE) END)  -
       SUM(CASE WHEN TRADE_TYPE='BUY' THEN (QUANTITY*PRICE) END) AS NET_PL, TRADINGSYMBOL AS STOCK_NAME    
       FROM dbo.[Table1]
       GROUP BY TRADINGSYMBOL, TRADE_DATE) AS PL
FULL OUTER JOIN
    (SELECT SUM(CASE WHEN TRADE_TYPE='BUY' THEN QUANTITY END) - 
       SUM(CASE WHEN TRADE_TYPE='SELL' THEN QUANTITY END) AS NET_QUANTITY, TRADINGSYMBOL AS STOCK_NAME
       FROM  dbo.[Table1]
       GROUP BY TRADINGSYMBOL) AS Q ON PL.STOCK_NAME = Q.STOCK_NAME

推荐阅读