Sql 如何按列显示数据

Sql 如何按列显示数据,sql,sql-server,sql-server-2000,Sql,Sql Server,Sql Server 2000,如何按列显示日期 表1 ID Date Value 001 01/01/2012 100 001 02/01/2012 200 ... ... 001 31/01/2012 250 002 01/01/2012 050 002 02/01/2012 100 ... 002 31/01/2012 075 .... 我想按日期按行显示值按id按行分组riw 预期产量 ID 01/01/2012 02/01/2012 ... 31/01/2012 001 100 200 .... 250 00

如何按列显示日期

表1

ID Date Value

001 01/01/2012 100
001 02/01/2012 200
...
...
001 31/01/2012 250
002 01/01/2012 050
002 02/01/2012 100
...
002 31/01/2012 075
....
我想按日期按行显示值按id按行分组riw

预期产量

ID 01/01/2012 02/01/2012 ... 31/01/2012

001  100 200 .... 250
002  050 100 .... 075
.....
如何使用SQL查询执行此操作?

试试这个

DECLARE @cols NVARCHAR(2000)
DECLARE @query NVARCHAR(4000)

SELECT  @cols = STUFF(( SELECT DISTINCT 
                                '],[' + `Date`
                        FROM    Table1
                        ORDER BY '],[' + `Date` FOR XML PATH('')
                      ), 1, 2, '') + ']';


SET @query = N'SELECT ID, '+
@cols +'
FROM
(SELECT  ID
FROM    Table1
PIVOT
(
SUM([`Value`])
FOR `Date` IN
( '+
@cols +' )
) AS pvt
ORDER BY ID;'


EXECUTE(@query)
SQL2000版本

DECLARE @date Date,@sql nvarchar(MAX)
DECLARE date_cursor CURSOR
  FOR SELECT DISTINCT [Date] FROM table_one ORDER BY [Date]
  SET @sql = ''
  OPEN date_cursor
  FETCH NEXT FROM date_cursor INTO @date
  WHILE @@FETCH_STATUS = 0
     BEGIN
         SET @sql = @sql+ ',MAX(CASE CONVERT(nvarchar(10),[Date],103) WHEN '''+CONVERT(nvarchar(10),@date,103)+''' THEN [Value] END) AS ['+CONVERT(nvarchar(10),@date,103)+']'
         FETCH NEXT FROM date_cursor INTO @date
     END 
CLOSE date_cursor
DEALLOCATE date_cursor

EXEC('SELECT ID'+@sql+' FROM table_one GROUP BY ID')

声明@loop int、@date date、@sql nvarchar(4000)
声明@attreable表
(
[日期]日期
)
从表1中插入@TENTABLE SELECT DISTINCT[Date],按[Date]订购
设置@sql=''
设置@loop=1

当(@loop@JetJack好的,我已经编辑了我的帖子。谢谢你的回答,当我执行这一行“EXEC('SELECT ID'+@sql++'FROM table_one GROUP BY ID')”时,错误如下:"关键字“FROM”附近的语法不正确,除了此错误之外,一切都正常,请…@JetJack这可能是因为内部版本
@sql
中有错误。尝试通过
从表中选择“SELECT ID”+@sql+“one GROUP by ID”
获取查询。然后,复制并运行您得到的查询,希望您能解决问题。我运行此qu时类似这样的“选择('Select ID'+@sql++'从表中按ID分组”),显示输出为“选择ID,MAX(CASE CONVERT(nvarchar(10),[Date],103)当'01/01/2012'时,然后[Value]END)为[01/01/2012],MAX从表中按ID分组”@JetJack
选择ID,MAX(CASE CONVERT(nvarchar(10),[Date],103),当'01/01/2012'时,然后[Value]END)为[01/01/2012],表\u one GROUP BY ID
中的MAX来自@sql,这是错误的查询。这可能是因为长度可变。@sql没有提供您想要的完整查询。
DECLARE @loop int,@date Date,@sql nvarchar(4000)
DECLARE @TempTable TABLE
(
  [Date] DATE
)
INSERT INTO @TempTable SELECT DISTINCT [Date] FROM table1 ORDER BY [Date]
  SET @sql = ''
  SET @loop = 1
  WHILE (@loop<=31)
    BEGIN
        IF EXISTS(SELECT * FROM @TempTable WHERE DAY([Date])=@loop) 
        BEGIN
            SET @date = (SELECT [Date] FROM @TempTable WHERE DAY([Date])=@loop)
            SET @sql = @sql+ ',MAX(CASE CONVERT(nvarchar(10),[Date],103) WHEN '''+CONVERT(nvarchar(10),@date,103)+''' THEN [Value] END) AS [DATE'+CONVERT(nvarchar(2),@loop)+']'
         END
         ELSE
            SET @sql = @sql+ ', NULL AS [DATE'+CONVERT(nvarchar(2),@loop)+']'
         SET @loop = @loop+1
    END 

EXEC('SELECT ID'+@sql+' FROM table1 GROUP BY ID')