是否可以从所选值创建列(字段名称)? 我为列创建了“好”名称,但无法创建文本列。
我有这个:
| ID | ProductID | PropName| PropVal|
----------------------------------------
| 1 | 560 | Color | green |
| 2 | 560 | Family |Resistors|
| 3 | 560 | Series | 375 |
我需要这个:
| ID | ProductID | Color | Family | Series |
------------------------------------------------
| 1 | 560 | green | Resistors| 375 |
答案 0 :(得分:2)
我不清楚你在结果中如何获得ID列......我猜它是ID的最小值。如果是别的话请告诉我。
您可以使用数据透视表执行此操作,但这是非透视方式:
WITH ProdList
(
SELECT MIN(ID), as ID, ProductID FROM tablename GROUP BY ProductID
)
SELECT P.ID,
P.ProductID,
c.PropValue AS 'Color'
f.PropValue AS 'Family'
s.PropValue AS 'Series'
FROM ProdList P
JOIN tablename c on c.ProductID = P.ProductID AND PropName = 'Color'
JOIN tablename f on c.ProductID = P.ProductID AND PropName = 'Family'
JOIN tablename s on c.ProductID = P.ProductID AND PropName = 'Series'
如果您不喜欢CTE,也可以使用这样的子查询来执行此操作:
SELECT P.ID,
P.ProductID,
c.PropValue AS 'Color'
f.PropValue AS 'Family'
s.PropValue AS 'Series'
FROM (SELECT MIN(ID), as ID, ProductID FROM tablename GROUP BY ProductID) P
JOIN tablename c on c.ProductID = P.ProductID AND PropName = 'Color'
JOIN tablename f on c.ProductID = P.ProductID AND PropName = 'Family'
JOIN tablename s on c.ProductID = P.ProductID AND PropName = 'Series'
评论更新
如果你有超过50个PropNames,你有两个选择 - 使用动态sql生成类似上面的内容(如果你希望PropName字段在某种程度上动态地改变,或者如果你可以在某些查询中得到总和优化,请执行此操作不要寻找所有的PropName值)或者只是做我手工做的事情......如果你有一个好的编辑器可以让你用列选择剪切和过去,那就不难了......如果你必须输入它,实际上并不难出......最多需要几个小时。
答案 1 :(得分:1)
听起来你可能正在尝试用聚合物来躲避。如果您向我们提供有关架构,数据和当前查询的更多信息,我们可以提供更具体的答案。 在此之前,此链接可能会提供一些帮助Pivot rows to columns without aggregate。
根据您提供的测试数据和所需的输出,可以获得所需的结果:
DECLARE @SampleData AS TABLE(ID INT, ProductID INT, PropName VARCHAR(20), PropVal VARCHAR(20))
INSERT INTO @SampleData VALUES(1, 560, 'Color', 'green')
INSERT INTO @SampleData VALUES(2, 560, 'Family', 'Resistors')
INSERT INTO @SampleData VALUES(3, 560, 'Series', '375')
SELECT MIN(ID) Id, ProductID, MIN(Color) AS Color, MIN(Family) AS Family, MIN(Series) AS Series
FROM ( SELECT * FROM @SampleData) src
PIVOT ( MIN(PropVal) FOR PropName IN(Color,Family,Series)) pvt
GROUP BY ProductID
但是,我不确定这是你想要的方式,你可能需要研究动态生成的SQL。如果您告诉我们您采用这种方法的原因,我们可以帮助您找到替代解决方案。