1

什么是最好的方法

方法一

SELECT 
SUM(CASE WHEN CODE = 'A' THEN ISNULL(UNIT,0.00)+ISNULL(UNIT_1,0.00) END) AS UNIT_SUM
FROM tblA

方法二

SELECT 
ISNULL(SUM(CASE WHEN CODE = 'A' THEN UNIT+UNIT_1 END),0.00) AS UNIT_SUM
FROM tblA

1)我关心的是我是否必须将 ISNULL 放在 CASE 语句或外部 CASE 语句中。它是否影响单位的总和或两个查询给出相同的结果。如果任何 UNIT 列具有 NULL 值,会发生什么情况。它会导致总计为 NULL。

2)我必须在 CASE 语句中使用 ELSE,如下所示:

那么 ...否则 0.00结束

4

6 回答 6

2

您还有其他答案指出您最好将过滤器= 'A'放入 where 子句以加快查询速度,这是正确的做法。我还想指出,如果没有要求和的行,您的查询会产生不同的结果:

SELECT 
ISNULL(SUM(CASE WHEN CODE = 'A' THEN UNIT END),0.00) AS UNIT_SUM
FROM tblA;
-- output: 0

SELECT 
SUM(CASE WHEN CODE = 'A' THEN ISNULL(UNIT,0.00) END) AS UNIT_SUM
FROM tblA;
-- output: null

如果要获取所有行的总和并将此数据放入列中,则可以使用此查询:

select
    isnull(sum(case when code = 'A' then unit end), 0) as [A],
    isnull(sum(case when code = 'B' then unit end), 0) as [B]
from tblA
-- filter out rows if there's more codes in your table
where code in ('A', 'B')

sql fiddle demo

于 2013-09-16T07:46:05.443 回答
1

无论哪种方式,正确的做法是:

SELECT 
ISNULL(SUM(UNIT),0.00) AS UNIT_SUM
FROM tblA
WHERE CODE = 'A'    --<------------ Index friendly

您的方法很糟糕,因为它对索引不友好。此外,使用 case 语句,您应该评估每一行。

如果您有更多列要聚合,您可以执行 CTE 查询,然后加入结果:

;with cte_a as (
    SELECT 
    coalesce(SUM(UNIT),0.00) AS UNIT_SUM_A
    FROM tblA
    WHERE CODE = 'A'
),
cte_b as (
    SELECT 
    coalesce(SUM(UNIT),0.00) AS UNIT_SUM_B
    FROM tblA
    WHERE CODE = 'B'
)
SELECT UNIT_SUM_A, UNIT_SUM_B
FROM cte_a cross join cte_b b 

由@RomanPekar 评论编辑了第二个查询。

于 2013-09-16T07:32:45.373 回答
1

如果您只想要情况的总和CODE='A',那么我会这样写:

SELECT ISNULL(SUM(UNIT),0.00) AS UNIT_SUM
FROM tblA
WHERE CODE = 'A'

如果您也选择其他列,那么我会这样做:

SELECT ISNULL(SUM(CASE WHEN CODE = 'A' THEN UNIT ELSE 0.00 END)) AS UNIT_SUM
FROM tblA
于 2013-09-16T07:31:09.337 回答
1

回答原来的问题:

我是否必须将 ISNULL 放在 CASE 语句中......?

不,你没有。SUM()忽略NULLs。因此,NULL 值的存在不会影响求和的结果。例外情况是所有值都为 NULL,或者您根本没有任何值。在这种情况下,你会得到NULL结果。

我必须在 CASE 语句中使用 ELSE 吗?

不,你不这样做是出于同样的原因。

...我需要在ISNULL()外面使用CASE吗..?

NULL如果所有值都是s 或者您没有任何值,这取决于您对结果集中的期望。如果您想拥有0或任何其他价值,请使用ISNULL()or COALESCE()。否则不要。

这是SQLFiddle演示

更新

鉴于您更改的问题中的表达方式

SUM(CASE WHEN CODE = 'A' THEN UNIT + UNIT_1 END)

您很可能希望同时使用ISNULL()或同时使用COALESCE()两者UNIT,并且UNIT_1如果您想将这些列之一的缺失值视为零值。在这种情况下,如果您想在结果集中获得零,即使没有与您的CASE条件匹配的值,您仍然需要使用ISNULL()or COALESCE()around SUM()

SELECT ISNULL(SUM(CASE WHEN CODE = 'A' 
                       THEN ISNULL(UNIT, 0) + ISNULL(UNIT_1, 0) 
                  END), 0) AS UNIT_SUM

或者

SELECT COALESCE(SUM(CASE WHEN CODE = 'A' 
                         THEN COALESCE(UNIT, 0) + COALESCE(UNIT_1, 0) 
                    END), 0) AS UNIT_SUM

这是SQLFiddle演示

于 2013-09-16T07:47:48.820 回答
0

如果您使用方法-II,则不需要 ELSE,所以我想就代码越少越好。

于 2013-09-16T07:29:29.727 回答
0

两种变体都返回相同的结果:

第一个在 SUM之前用零替换 NULL,第二个在 SUM之后替换一个 NULL ,即没有带有“A”的行。

顺便说一句,我会用标准 SQL COALESCE(UNIT,0.00) 替换专有的 ISNULL。

当然,您可以简单地将其替换为:

CASE WHEN CODE = 'A' THEN UNIT ELSE 0.00 END
于 2013-09-16T07:43:16.670 回答