日期:2014-05-17  浏览次数:20388 次

SQL行转列后,如何知道有多少列,列名是什么?
就是有数据

n date num
joy 2011-01 10
use 2011-02 12
ing 2011-03 13

行转列后

n 2011-01 2011-02 2011-03
joy 10 0 0
use 0 12 0
ing 0 0 13

现在是因为数据有个不确定性,有可能出现如下数据

n date num
joy 2011-01 10
use 2011-02 12
ing 2011-04 14

那转列后就应该是这样:
n 2011-01 2011-02 2011-04
joy 10 0 0
use 0 12 0
ing 0 0 14

现在我是想如何能确定有多少列?列名分别是什么? 我程序里需要用到具体的多少列
用的是存储过程进行行转列的


------解决方案--------------------
SQL code
--> 测试数据:[tb]
IF OBJECT_ID('[tb]') IS NOT NULL DROP TABLE [tb]
GO 
CREATE TABLE [tb]([n] VARCHAR(3),[date] VARCHAR(7),[num] INT)
INSERT [tb]
SELECT 'joy','2011-01',10 UNION ALL
SELECT 'use','2011-02',12 UNION ALL
SELECT 'ing','2011-03',13
--------------开始查询--------------------------

DECLARE @sql VARCHAR(8000)
SET @sql = ''
SELECT  @sql = ISNULL(@sql + ',', '') + QUOTENAME([date]) + '=max(case when [date]=' + QUOTENAME([date], '''') + ' then [num] else 0 end)'
FROM    [tb]
GROUP BY [date]
EXEC('select [n]'+@sql+' from [tb] group by [n]')
 


----------------结果----------------------------
/* 
n    2011-01     2011-02     2011-03
---- ----------- ----------- -----------
ing  0           0           13
joy  10          0           0
use  0           12          0

(3 行受影响)



*/