【问题标题】:SQL - Perform action for each group of itemsSQL - 对每组项目执行操作
【发布时间】:2013-11-05 13:19:29
【问题描述】:

例如我有一张桌子

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

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

【问题讨论】:

  • 然后对于每个组我想执行一些操作你必须比这更具体。
  • 您应该注意,因为您的外键是 ID,所以您不是在检查 GROUP 是否有地址,而是在检查 ID 是否有地址。如果您想检查 GROUP 是否有地址,则必须在 ADDRESS 表中包含“KEY”和“VALUE”字段,以便加入它们。
  • 如果这回答了您的问题,请告诉我。
  • 感谢您的回答。我稍后会尝试,现在做不到。还有没有“地址”表中的“键”和“值”字段的任何方法?
  • 试试我的建议,看看它是否能产生预期的结果。如果没有,请发布您的输出,我会帮助您。

标签: sql sql-server group-by grouping


【解决方案1】:

【讨论】:

    【解决方案2】:

    这似乎有效。

    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]
    

    【讨论】:

    • 此外,您上面的输出不正确,因为 VALUE 字段中没有“980”。
    • 固定字段为 '980'
    猜你喜欢
    • 1970-01-01
    • 2019-10-29
    • 2011-08-29
    • 2012-03-29
    • 2020-04-25
    • 1970-01-01
    • 1970-01-01
    • 2019-09-07
    • 1970-01-01
    相关资源
    最近更新 更多