如何使用CASE语句进行GROUP BY?

时间:2016-01-26 17:26:08

标签: sql sql-server sql-server-2012

我的SQL示例如下......

DECLARE @a TABLE(
    id INT,
    val BIT
);
INSERT INTO @a(id,val) VALUES (1,0),(2,0),(3,1),(4,0),(5,1);

SELECT
    id = CASE
        WHEN val = 1 THEN id
        ELSE MAX(id)
    END
FROM @a
WHERE val = 0
GROUP BY id, val;

我的结果是什么:

id
---
 1
 2
 4

我想要得到的......

id
---
 4

或者如果我做了“WHERE val = 1”那么我想要的是......

id
---
 3
 5

我基本上想说的是“如果我选择val = 1,我想要所有行,但如果我选择val = 0,我只想要具有最高id的行”。有什么想法吗?

2 个答案:

答案 0 :(得分:2)

我不确定我是否理解您要执行的操作,但以下查询会提供WHERE val = 1WHERE val = 0的预期结果。我的想法是将案例移到GROUP BY子句

SELECT MAX(id)
FROM @a
WHERE val = 1
GROUP BY CASE WHEN val = 1 THEN id ELSE 0 END

答案 1 :(得分:0)

您可以使用UNION语句组合表。因此,如果我们将您想要做的事分成两个select语句,那么如果WHERE = 0

,我们会得到以下结果
SELECT MAX(id) 
FROM @a
GROUP BY ID, VAL

UNION

SELECT ID
FROM @a
WHERE val = 0 AND val = 1
GROUP BY ID, VAL

以下是WHERE = 1

SELECT MAX(id) 
FROM @a
GROUP BY ID, VAL

UNION

SELECT ID
FROM @a
WHERE val = 1 AND val = 1
GROUP BY ID, VAL

可能明确为什么更改where子句让它做一些不同的事情对我来说似乎很奇怪。显然,在第一个联盟之后的部分是愚蠢/无用的。在第二个中,在where子句中两次使用相同的表达式似乎也很奇怪。但这符合您在一个地方更改一个值并有两个不同结果的要求。

也许您可以在看到解决方案后更好地解释您的要求吗?