SQL Server 如何在子查询中忽略(空值或0)值

h79rfbju  于 2022-12-28  发布在  其他
关注(0)|答案(1)|浏览(183)

我有一个名为(sale)的表:
| 范畴|数量|通货|
| - ------| - ------| - ------|
| 第1类|一万|美元|
| 第2类|五千|排减单位|
| 第三类|一万五千|合成孔径雷达|
| 第2类|三万|美元|
| 第1类|四万五千|合成孔径雷达|
| 第三类|七千|排减单位|
| 第2类|三千|排减单位|
| 第四类|无|美元|
我编写此查询是为了获得下表中的结果:注意:查询具有来自同一个表的子查询:

SELECT  S.[Category]

       ,(SELECT ISNULL(SUM([Amount]),0)
           FROM SALE
          WHERE [Currency] = 'USD'
            AND SALE.[CategoryID] = S.[CategoryID]) AS 'Total_USD'
            
       ,(SELECT ISNULL(SUM([Amount]),0) 
           FROM SALE
          WHERE [Currency] = 'ERU'
            AND SALE.[CategoryID] = S.[CategoryID]) AS 'Total_ERU'
            
       ,(SELECT ISNULL(SUM([Amount]),0) 
           FROM SALE
          WHERE [Currency] = 'SAR'
            AND SALE.[CategoryID] = s.[CategoryID]) AS 'Total_SAR'
        
        FROM Sale AS S
        GROUP BY S.[CategoryID],S.[CategoryName]

结果:
| 范畴|美元共计|排减单位共计|SAR总计|
| - ------| - ------| - ------| - ------|
| 第1类|一万|无|四万五千|
| 第2类|三万|八千|无|
| 第三类|无|七千|一万五千|
| 第四类|无|无|无|
我的问题是:如果所有子查询返回(空或零)值,如何避免(0)值,如上面的(cat4)。
我尝试了(Having)子句,但我必须在(Having)中重新编写所有子查询,这不是一件好事。

qv7cva1a

qv7cva1a1#

如果您切换到条件聚集(无论如何,这会更有性能),则可以使用HAVING。由于您希望排除包含'EUR'的行,因此需要在其中使用CASE表达式:

SELECT S.Category,
       SUM(CASE currency WHEN 'USD' THEN amount ELSE 0 END) AS USD,
       --SUM(CASE currency WHEN 'EUR' THEN amount ELSE 0 END) AS EUR, --Seems you don't want EUR rows
       SUM(CASE currency WHEN 'SAR' THEN amount ELSE 0 END) AS SAR,
       SUM(CASE currency WHEN 'ERU' THEN amount ELSE 0 END) AS ERU
FROM dbo.Sale S
GROUP BY S.Category
HAVING SUM(CASE WHEN currency IN ('USD','SAR','ERU') THEN amount END) != 0;

由于货币'EUR'似乎是一个印刷错误,您可能需要:

HAVING SUM(amount) != 0;

相关问题