【问题标题】:Group key-value columns into a rows per group with column per key将键值列分组为每组一行,每个键列
【发布时间】:2018-02-16 09:43:36
【问题描述】:

我需要在一个表中显示存储在 MS SQL 数据库中的 n 个键的键/值对组,每组一条记录,每个键一列。

我找到了该示例,但在我的情况下,键(最后是列)不固定,也必须来自数据库。 Group key-value columns into a single row

例子:

CREATE TABLE entries
    ([group_id] int, [attr_key] varchar(20), [attr_value] varchar(20))
;

INSERT INTO entries
   ([group_id], [attr_key], [attr_value])

VALUES
   (1, 'color', 'blue'),
   (1, 'size', 'L'),
   (2, 'color', 'red'),
   (2, 'size', 'M'),
   (3, 'color', 'green'),
   (3, 'size', 'M'),
   (3, 'Vendor', 'myVendor') ,
   (3, 'picture', 'Bear') 
;

Fiddle 测试:http://sqlfiddle.com/#!18/c1ff2/1/0

| group_id | attr_key | attr_value |
|----------|----------|------------|
|        1 |    color |       blue |
|        1 |     size |          L |
|        2 |    color |        red |
|        2 |     size |          M |
|        3 |    color |      green |
|        3 |     size |          M |
|        3 |   vendor |   myVendor |
|        3 |  picture |       Bear |

结果应该是这样的:

| group_id | color | size | vendor   | picture | 
|----------|-------|------|----------|---------|
|        1 | blue  |  L   | NULL     |  NULL   |
|        2 | red   |  M   | NULL     |  NULL   |
|        3 | green |  M   | myVendor |  Bear   |

当用户稍后添加属性时,表也应该多一列而不更改 SQL 查询。

【问题讨论】:

    标签: sql sql-server key-value relational relational-division


    【解决方案1】:

    您应该对数量不定的属性使用动态枢轴

    declare @columns varchar(max)
    declare @sql varchar(max)
    
    set @columns = stuff((select ',' + quotename(attr_key) from entries
    group by attr_key
    for xml path('')), 1, 1, '')
    
    set @sql = '
        select
            group_id, ' + @columns + '
        from
            entries
        pivot (
            max(attr_value) for attr_key in (' + @columns + ')
        ) p'
    
    
    exec (@sql)
    

    【讨论】:

    • 比我快几秒 :)
    【解决方案2】:
    DECLARE  @entries TABLE
        ([group_id] int, [attr_key] varchar(20), [attr_value] varchar(20))
    ;
    
    INSERT INTO @entries
        ([group_id], [attr_key], [attr_value])
    VALUES
        (1, 'color', 'blue'),
        (1, 'size', 'L'),
        (2, 'color', 'red'),
        (2, 'size', 'M'),
        (3, 'color', 'green'),
        (3, 'size', 'M'),
        (3, 'Vendor', 'myVendor') ,
        (3, 'picture', 'Bear')
    
    ;
    
    SELECT * FROM (
    SELECT * 
    FROM @entries
    ) AS A
    PIVOT (MAX([attr_value]) FOR [attr_key] IN ([color],[size],[Vendor],[picture])) AS P
    

    输出

    group_id    color   size    Vendor  picture
    1           blue    L       NULL    NULL
    2           red     M       NULL    NULL
    3           green   M      myVendor Bear
    

    【讨论】:

      猜你喜欢
      • 2015-09-04
      • 1970-01-01
      • 2021-07-16
      • 2019-09-22
      • 2014-01-31
      • 1970-01-01
      • 2023-02-05
      • 2014-09-24
      • 2014-09-15
      相关资源
      最近更新 更多