MSSQL Table1有以下数据:
AttributeID | ProductID | Attribute | Value |
--------------------------------------------------
1 | 1111 | Attribute1 | Prod1_Val1 |
2 | 1111 | Attribute2 | Prod1_Val2 |
3 | 1111 | Attribute3 | Prod1_Val3 |
4 | 2222 | Attribute1 | Prod2_Val1 |
5 | 2222 | Attribute2 | Prod2_Val2 |
6 | 2222 | Attribute3 | Prod2_Val3 |
7 | 3333 | Attribute1 | Prod3_Val1 |
8 | 3333 | Attribute2 | Prod3_Val2 |
9 | 3333 | Attribute3 | Prod3_Val3 |
10 | 4444 | Attribute1 | Prod4_Val1 |
11 | 4444 | Attribute2 | Prod4_Val2 |
12 | 5555 | Attribute4 | Prod5_Val1 |
MSSQL Table2具有以下数据:
ProductID | ProductName |
--------------------------------------------------
1111 | Product1 |
2222 | Product2 |
3333 | Product3 |
4444 | Product4 |
5555 | Product5 |
我需要的结果是:
Product | Product1 | Product3 | Product3 | Product4 | Product5 |
Attribute1 | Prod1_Val1 | Prod2_Val1 | Prod3_Val1 | Prod4_Val1 | -- |
Attribute2 | Prod1_Val2 | Prod2_Val2 | Prod3_Val2 | Prod4_Val2 | -- |
Attribute3 | Prod1_Val3 | Prod2_Val3 | Prod3_Val3 | -- | -- |
Attribute4 | -- | -- | -- | -- | Prod5_Val1 |
Attribute5 | -- | -- | -- | -- | -- |
我想知道使用Table1和Table2是否可以使用SQL本身实现这个期望的结果。如果是,请通过提供SQL来帮助我。感谢您提前及时提供帮助。
答案 0 :(得分:0)
正如TomTom所提到的,您将需要使用SQL Server的PIVOT operator:
SELECT Attribute, [Product1], [Product2], [Product3], [Product4], [Product5]
FROM (
SELECT ProductName, Attribute, Value
FROM Table1
INNER JOIN Table2 ON ( Table2.ProductId = Table1.ProductId )
) AS SourceTable
PIVOT (
Min(Value)
FOR ProductName IN ([Product1], [Product2], [Product3], [Product4], [Product5])
) AS PivotTable
请注意,您需要预先确定在写入时要输出的列数(即[Product1],[Product2],..., [ProductN] )你的SQL查询。
此外,由于PIVOT聚合数据,上面的示例使用Min()
函数。 (您可以根据需要轻松使用Max()
或其他聚合函数。)对于没有值的所有元素,输出 NULL 。