Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/79.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby-on-rails-4/2.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_Group By_Grouping - Fatal编程技术网

SQL-对每组项目执行操作

SQL-对每组项目执行操作,sql,sql-server,group-by,grouping,Sql,Sql Server,Group By,Grouping,例如,我有一张桌子 | ID | Key | Value | -------------------- | 1 | a | 123 | | 2 | b | 354 | | 3 | c | 980 | | 4 | b | 354 | | 5 | a | 123 | 我想得到键和值相等的组。就这样吧 | 1 | a | 123 | | 5 | a | 123 | -------------------- | 2 | b |

例如,我有一张桌子

| ID | Key | Value |
--------------------
| 1  | a   | 123   |
| 2  | b   | 354   |
| 3  | c   | 980   |
| 4  | b   | 354   |
| 5  | a   | 123   |
我想得到
相等的组。就这样吧

| 1  | a   | 123   |
| 5  | a   | 123   |
--------------------
| 2  | b   | 354   |
| 4  | b   | 354   |
--------------------
| 3  | c   | 980   |
然后,我要为每个小组做一些动作。类似于为每个
ID
检查另一个表中的一些值,并设置一些标志

我认为,
groupby
在这里很有用,但我不知道如何实现我想要的

编辑

如果你需要一个动作的例子

假设我有另一个表,
ID
是外键

| ID | Name | Address | IsActive |
对于每个组,我要检查该组中是否有任何项目有地址,并将该组中所有其他项目的
IsActive
设置为
false

检查该部分。

这似乎有效

CREATE TABLE #TEMP
(ID INT, [KEY] NVARCHAR(10), VALUE INT)
INSERT INTO #TEMP VALUES ('1', 'A', '123'), 
( '2',  'b', '354'), 
( '3', 'c', '980'),
('4', 'b', '354'),
('5', 'a', '123')


SELECT ID, [KEY], VALUE
FROM #TEMP 
GROUP BY [KEY], VALUE, ID
这就实现了分组。要执行操作,需要在检查要加入的表时实现一个CASE

CREATE TABLE #ADDRESS
([ADDRESS] NVARCHAR(25), ID INT)
INSERT INTO #ADDRESS VALUES ('123 MAIN ST', '1')

SELECT A.ID, A.[KEY], A.VALUE,
           CASE WHEN B.[ADDRESS] IS NOT NULL THEN 'ACTIVE' ELSE 'INACTIVE' END AS 'ACTIVE?'
FROM #TEMP A
LEFT JOIN #ADDRESS B
ON A.ID = B.ID
GROUP BY A.[KEY], A.VALUE, A.ID, B.[ADDRESS]

然后,对于我想要执行的每个组,您必须更具体。您应该注意,因为您的外键是ID,所以您没有检查组是否有地址,而是检查ID是否有地址。如果您想检查组是否有地址,您的地址表中必须有“键”和“值”字段,以便加入它们。如果这回答了您的问题,请让我知道。谢谢您的回答。我稍后再试试,现在不行。还有什么方法可以在“地址”表中不包含“键”和“值”字段的情况下执行此操作?请尝试我的建议,看看它是否会产生所需的结果。如果没有,请发布您的输出,我将帮助您解决问题。此外,您上面的输出不正确,因为值字段中没有“980”。修复了带有“980”的字段