SQL - 对每组项执行操作

时间:2013-11-05 13:19:30

标签: sql sql-server group-by grouping

例如我有一张表

| ID | Key | Value |
--------------------
| 1  | a   | 123   |
| 2  | b   | 354   |
| 3  | c   | 980   |
| 4  | b   | 354   |
| 5  | a   | 123   |

我希望获得KeyValue相等的群组。所以它将是

| 1  | a   | 123   |
| 5  | a   | 123   |
--------------------
| 2  | b   | 354   |
| 4  | b   | 354   |
--------------------
| 3  | c   | 980   |

然后对于每个组我想要执行一些操作。比如检查每个ID的另一个表中的某些值并设置一些标志......

我认为GROUP BY在这里很有用,但我不知道如何实现我想要的目标。

修改

如果你需要行动的例子......

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

| ID | Name | Address | IsActive |

对于每个群组,如果此群组中的任何项目都有地址,我想要查询,并为该群组中的所有其他项目设置IsActivefalse

2 个答案:

答案 0 :(得分:0)

答案 1 :(得分:0)

这似乎有效。

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 WHEN来检查您要加入的表。

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]