如何从选定的值创建列

时间:2013-12-08 21:54:43

标签: sql sql-server tsql

是否可以从所选值创建列(字段名称)? 我为列创建了“好”名称,但无法创建文本列。

selected values

我有这个:

|   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   |

2 个答案:

答案 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。如果您告诉我们您采用这种方法的原因,我们可以帮助您找到替代解决方案。