我目前有这样的陈述......
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}}来选择属性名称,但是在创建新属性名称时需要手动修改。
非常感谢提前!
答案 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
'
为主查询中需要加入的每个属性创建其中一个。