在T-SQL中,我有一个简单但非常重要的概念要讲清楚。
我正在编写大量针对表的T-SQL查询,其中包含大量聚合和分组依据。
现在,在我的T-SQL查询的SELECT子句中,我有一个CASE-WHEN语句。如下所示:
语句1:
SELECT X, Y, Z,
A = CASE
WHEN P = 1 THEN B
ELSE Q
END,
SUM(Sales)
FROM mytable
GROUP BY
X, Y, Z,
CASE
WHEN P = 1 THEN B
ELSE Q
END现在可以将语句1写成语句2了吗?
语句2:
SELECT X, Y, Z,
A = CASE
WHEN P = 1 THEN B
ELSE Q
END,
SUM(Sales)
FROM mytable
GROUP BY
X, Y, Z,
P, B, Q语句1=语句2吗?
是否可以在GROUP BY子句中将SELECT子句中的CASE-WHEN修改为单独的列?
结果集是否总是相同的?
发布于 2018-06-22 16:55:23
区别取决于您可能从列P、B和Q中获得的不同值的数量,而不是CASE语句的结果。你可以在这个例子中发现其中的不同之处。
IF OBJECT_ID('tempdb..#Data') IS NOT NULL
DROP TABLE #Data
CREATE TABLE #Data (
P INT,
B INT,
Q INT,
Sales INT)
INSERT INTO #Data (
P,
B,
Q,
Sales)
VALUES
(1, 20, 300, 1000),
(1, 20, 400, 500),
(2, 1, 1, 50),
(2, 1, 1, 250)
-- Statement 2
SELECT
P,
B,
Q,
TotalSales = SUM(D.Sales)
FROM
#Data AS D
GROUP BY
P,
B,
Q
/*
All different combinations of PBQ and listed, and their sales added
P B Q TotalSales
1 20 300 1000
1 20 400 500
2 1 1 300
*/
-- Statement 1
SELECT
CaseResult = CASE WHEN P = 1 THEN B ELSE Q END,
TotalSales = SUM(D.Sales)
FROM
#Data AS D
GROUP BY
CASE WHEN P = 1 THEN B ELSE Q END
/*
The grouping value depends on value B when P = 1 (and not on Q!) so
all records with P = 1 and same B are grouped together and
all records with P = 0 and same Q are grouped together
CaseResult TotalSales
1 300
20 1500
*/当您的数据从CASE到P、B和Q的组合没有生成不同的值时,可能会出现这种情况,在这种情况下,两个查询的结果将是相同的。
https://stackoverflow.com/questions/50983391
复制相似问题