SQL Server:将INNER JOIN分组以分隔列

时间:2014-10-30 14:12:38

标签: sql sql-server database

我目前有这样的陈述......

SELECT * 
FROM stock AS s
INNER JOIN stock_attributes AS sa ON sa.stock_code = s.stock_code

这会输出这样的信息......

| stock_code | attribute name | attribute value |
|------------|----------------|-----------------|
|   ABC01    |     color      |       red       |
|   ABC01    |      size      |      small      |
|   ABC01    |     price      |      10.0       |
|   XYZ99    |     color      |      blue       |
|   XYZ99    |      size      |      large      |
|   XYZ99    |     price      |      50.0       |

但我希望它看起来像这样

| stock_code |     color      |      size       |      price       |
|------------|----------------|-----------------|------------------|
|   ABC01    |      red       |     small       |       10.0       |
|   XYZ99    |     blue       |     large       |       50.0       |

我已经在SO上找到了很多这样的例子,但是它们看起来非常精确,并且复杂的例子确实存在一个函数将存在于我想要实现的目标上。

目前,我使用多个INNER JOIN来实现此目的,每个SELECT选择一个{{1}}来选择属性名称,但是在创建新属性名称时需要手动修改。

非常感谢提前!

3 个答案:

答案 0 :(得分:1)

基于CASE的聚合可用于执行数据透视

   SELECT stock_code,
           MAX( case when attribute name='color' then attributevalue end ) as color,
           MAX( case when attribute name='size' then attributevalue end ) as size,
           MAX( case when attribute name='price' then attributevalue end ) as price
    FROM Table1
    GROUP BY stock_code

答案 1 :(得分:1)

好的,所以没有完全回答问题,因为我需要定义名称,但我使用这个...(只有一个选择语句)

SELECT * FROM (
   SELECT * 
   FROM stock AS s
   INNER JOIN stock_attributes AS sa ON sa.stock_code = s.stock_code
) AS MyData
PIVOT(
   MAX(attibute_value)
   FOR attribute_name IN ("Color", "Size", "Price")
) AS MyPivotData

答案 2 :(得分:0)

如果您可以忍受限制,每次添加新属性时都必须更改代码,那么解决方案非常简单。

CREATE VIEW STOCK_COLOURS AS SELECT STOCK_CODE, STOCK_VALUE FROM STOCK_ATTRIBUTES WHERE ATTRIBUTE_NAME = 'colour'

为主查询中需要加入的每个属性创建其中一个。