2016-01-26 82 views
0

我的SQL实例如下...如何使用CASE语句GROUP BY?

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 

或者,如果我做“哪里val = 1”那么我想要的是...

id 
--- 
3 
5 

我基本上想说的是“如果我选择val = 1的位置,我想要所有的行,但是如果我选择val = 0的位置,我只想要具有最高ID的行。有任何想法吗?

+1

不知道你在这里试图做什么。 val = 0时为什么只有一行,但当val = 1时都需要两个?这根本没有意义。 –

+0

我基本上想说的是“如果val = 1,我想要所有的行,但是如果val = 0,我只想要具有最高id的行”。我会把它放在我的问题中,谢谢。 – felloffthestack

+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 
+0

这是一个非常好奇的解决方案,我非常喜欢它。谢谢! – felloffthestack

+0

@felloffthestack我会一起去 – JamieD77

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子句中有两次相同的表达式似乎也很奇怪。但是,这可以满足您的要求,可以在某个地方更改某个值,并获得两个不同的结果

也许你现在可以更好地解释你的需求了吗?

+0

对不起,我仍然不确定我是否应该清楚地解释它,但@ JamieD77找到了我正在寻找的解决方案。 – felloffthestack