SELECT Name1, Name2, Value FROM mytable
给了我以下结果集:SQL Server PIVOT也许?
Name1 Name2 Value A P1 1 A P2 1 A P3 2 B P1 3 B P2 1 B P4 1
如何翻译,为:
A B P1 1 4 P2 1 1 P3 2 null P4 null 1
感谢,
SELECT Name1, Name2, Value FROM mytable
给了我以下结果集:SQL Server PIVOT也许?
Name1 Name2 Value A P1 1 A P2 1 A P3 2 B P1 3 B P2 1 B P4 1
如何翻译,为:
A B P1 1 4 P2 1 1 P3 2 null P4 null 1
感谢,
您可以使用PIVOT条款。您的查询可能是这样的:使用上述示例数据
WITH Source as (
SELECT Name1, Name2, [Value]
FROM mytable
)
SELECT Name2, CASE WHEN A IS NOT NULL THEN A ELSE 'your string' END As A
, CASE WHEN B IS NOT NULL THEN B ELSE 'your string' END As B
FROM (
SELECT Name2, Name1, [Value]
FROM Source
) s
PIVOT
(
MAX([Value]) FOR Name1 IN (A, B) -- any other Name1 would go here
) p
,我的结果是
P1 1 3
P2 1 1
P3 2 your string
P4 your string 1
编辑:
既然你有一个未知的列数,则需要看看使用动态SQL,这里有几个关于SO的答案。
问题在于,OP不能将输出限制在A,B中。也可能有C,...,X,正如他在其中一条评论中所述。 –
我做了一些修改,并能够通过使用此示例和http://stackoverflow.com/questions/159456/pivot-table-and-concatenate-columns-sql-problem#159803来获得它的工作。最后一件事,我将如何去替换另一个String的NULL值。我尝试了一个CASE,但它只替换了具有值的'Value'字段,而不是NULL – user683302
我使用CASE更新了上面的PIVOT查询,并将NUll值更改为字符串。 – Taryn
我没有SQL服务器在工作运行的这里,所以这可能不是通过完全syntatically正确的,但一个方法是交叉表
SELECT name2
, SUM(CASE WHEN name1 = 'A' THEN value END) AS A
, SUM(CASE WHEN name1 = 'B' THEN value END) AS B
FROM table
GROUP BY name2
对于可变数量您可以使用动态SQL的列:
DECLARE @sql varchar(max)
SELECT @sql = COALESCE(@sql+',','') + 'SUM(CASE WHEN nane1 = '''+name1+''' THEN value END) AS ['+name1']' FROM table
SET @sql = 'SELECT name2, '[email protected]+' FROM table GROUP BY name2'
EXEC(@sql)
Tisk,tisk ...在工作中回答SO问题=) – jadarnel27
我正在等待我的代码编译:-P – Zugwalt
有很多[更具建设性](http:// xkcd.com/303/)当你的代码正在编译时,你可以做的事情;)当我在工作时,我发布了这个评论以及haha – jadarnel27
由于使用的是SQL Server 2005中,这里是代码:
DECLARE @cols VARCHAR(1000)
DECLARE @sqlquery VARCHAR(2000)
SELECT @cols = STUFF((SELECT distinct ',' + QuoteName([Name1])
FROM myTable FOR XML PATH('')), 1, 1, '')
SET @sqlquery = 'SELECT * FROM
(SELECT Name2, Name1, Value
FROM myTable) base
PIVOT (Sum(Value) FOR [Name1]
IN (' + @cols + ')) AS finalpivot'
EXECUTE (@sqlquery)
这将工作,无论你有多少个不同的状态有。它用PIVOT
动态地组装一个查询。您可以通过动态列来执行PIVOT的唯一方法是动态组装查询,这可以在SQL Server中完成。
其他例子:
+1 QuoteName' –
@Martin它避免了注入攻击! –
+1我只是无言以对。 –
嗨@user!你使用的是什么DBMS? – jadarnel27
A和B是常量的固定列表吗? – Neil
@ jadarnel27 - 这个问题的标题有一个提示;) – Tony