Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 如何使用案例陈述进行分组?_Sql_Sql Server_Sql Server 2012 - Fatal编程技术网

Sql 如何使用案例陈述进行分组?

Sql 如何使用案例陈述进行分组?,sql,sql-server,sql-server-2012,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 -

我的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
或者如果我在val=1的地方做了,那么我想要的是

id
---
 3
 5

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

可以使用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子句中有两个相同的表达式似乎也很奇怪。但这满足了您在where中更改一个值并产生两个不同结果的要求


看到解决方案后,也许您可以更好地解释您的需求?

您可以使用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子句中有两个相同的表达式似乎也很奇怪。但这满足了您在where中更改一个值并产生两个不同结果的要求


看到解决方案后,也许您可以更好地解释您的需求?

我不确定是否理解您正在尝试执行的操作,但下面的查询给出了预期结果,其中val=1或val=0。我们的想法是将案例转移到GROUPBY子句中


我不确定我是否理解您试图执行的操作,但是下面的查询给出了预期的结果,其中val=1或val=0。我们的想法是将案例转移到GROUPBY子句中


不知道你在这里想做什么。为什么当val=0时只有一行,而当val=1时您想要两行???这根本没有意义。我基本上想说的是,如果val=1,我想要所有的行,但是如果val=0,我只想要id最高的行。我会把它放在我的问题中,谢谢。我想你已经把你的例子简化了很多,不再代表问题了。@SeanLange-这没有意义-但我设法想出了一个解决方案@霍根,我看到了。我还想到了两个说法,但这完全不合逻辑,我没有发表不知道你在这里想做什么。为什么当val=0时只有一行,而当val=1时您想要两行???这根本没有意义。我基本上想说的是,如果val=1,我想要所有的行,但是如果val=0,我只想要id最高的行。我会把它放在我的问题中,谢谢。我想你已经把你的例子简化了很多,不再代表问题了。@SeanLange-这没有意义-但我设法想出了一个解决方案@霍根,我看到了。我还想到了两个说法,但这完全不合逻辑,我没有发表抱歉,我仍然不确定我是否解释得尽可能清楚,但是@JamieD77找到了我想要的解决方案。抱歉,我仍然不确定我是否解释得尽可能清楚,但是@JamieD77找到了我想要的解决方案。这是一个非常奇怪的解决方案,我非常喜欢它。谢谢大家!@伙计们,我会同意这是一个非常奇怪的解决方案,我非常喜欢它。谢谢大家!@伙计们,我同意这个