在SQL中将一个值显示为列和其他AS值

时间:2014-02-18 06:00:25

标签: sql sql-server sql-server-2012

我有以下查询,

SELECT  AT.Name AS Name, COALESCE(VAL.Value, VALP.Value) AS Value
FROM    Attributes AT
        LEFT OUTER JOIN AttributesValues VAL ON VAL.AttributeID = AT.ID 
        LEFT OUTER JOIN AttributesValues VALP ON VALP.AttributeID = AT.ID
        LEFT OUTER JOIN Products p ON p.ID = VAL.ProductID 
        LEFT OUTER JOIN AttributesGroups G ON G.ID = AT.GroupID
ORDER BY p.ID;

我看的是将名称显示为列,将值显示为列值。例如,

Name1  | Name2  | Name3
-----------------------
Value1 | Value2 | Value3

1 个答案:

答案 0 :(得分:3)

希望这最适合你的情况..

CREATE TABLE #temp(Name varchar(25),value varchar(25))
INSERT #temp VALUES('a',1),('b',2),('c',3),('d',4),('e',4),('f',5)

首先为您的名字创建一个逗号分隔的字符串,这样您就可以将其用作数据透视中的列。

DECLARE @CommoSeperatedNames varchar(max)
SELECT @CommoSeperatedNames=STUFF((SELECT ',' + s.Name FROM #temp s ORDER BY s.Name FOR XML PATH('')),1,1,'')

此查询使用pivot,这里我使用动态查询从上面的变量中获取所有列名。

Execute( 'select '+@CommoSeperatedNames+' from #temp
pivot 
(
    MIN(value)
    FOR Name
  IN ('+ @CommoSeperatedNames+')
) as TST')

如果我们打印上面的动态查询,则输出以下语句。

select a,b,c,d,e,f from #temp
pivot 
(
    MIN(value)
    FOR Name
  IN (a,b,c,d,e,f)
) as TST

输出:

a   b   c   d   e   f
1   2   3   4   4   5