我的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的行”。有什么想法吗?
答案 0 :(得分:2)
我不确定我是否理解您要执行的操作,但以下查询会提供WHERE val = 1
或WHERE 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子句中两次使用相同的表达式似乎也很奇怪。但这符合您在一个地方更改一个值并有两个不同结果的要求。
也许您可以在看到解决方案后更好地解释您的要求吗?