单号    日期         数量
1     2009-03-04      10
1     2009-03-05      15
1     2009-03-05       2
2     2009-03-05      12
2     2009-03-06      12
2     2009-03-06       4   要求得出以下结果单号  2009-03-04    2009-03-05   2009-03-06
1       10            17            0
2        0            12           16

解决方案 »

  1.   

    ----------------------------------------------------------------------------------
    -- Author : htl258(Tony)
    -- Date   : 2010-07-25 03:01:32
    -- Version: Microsoft SQL Server 2008 (RTM) - 10.0.1600.22 (Intel X86) 
    --          Jul  9 2008 14:43:34 
    --          Copyright (c) 1988-2008 Microsoft Corporation
    --          Developer Edition on Windows NT 5.1 <X86> (Build 2600: Service Pack 2)
    -- Blog   : http://blog.csdn.net/htl258
    ------------------------------------------------------------------------------------> 生成测试数据表: [tb]
    IF OBJECT_ID('[tb]') IS NOT NULL
    DROP TABLE [tb]
    GO
    CREATE TABLE [tb] ([单号] [int],[日期] [datetime],[数量] [int])
    INSERT INTO [tb]
    SELECT '1','2009-03-04','10' UNION ALL
    SELECT '1','2009-03-05','15' UNION ALL
    SELECT '1','2009-03-05','2' UNION ALL
    SELECT '2','2009-03-05','12' UNION ALL
    SELECT '2','2009-03-06','12' UNION ALL
    SELECT '2','2009-03-06','4'--SELECT * FROM [tb]-->SQL查询如下:
    DECLARE @s VARCHAR(MAX),@c VARCHAR(MAX)
    SELECT @c=ISNULL(@c+',','')+'ISNULL('+QUOTENAME(CONVERT(VARCHAR,日期,23))+',0)'
     +QUOTENAME(CONVERT(VARCHAR,日期,23)),
       @s=ISNULL(@s+',','')+QUOTENAME(CONVERT(VARCHAR,日期,23)) 
    FROM tb 
    GROUP BY CONVERT(VARCHAR,日期,23) 
    EXEC('
    SELECT 单号,'+@c+'
    FROM (
    SELECT 单号,CONVERT(VARCHAR,日期,23) 日期,数量
    FROM tb 
    ) a
    PIVOT(SUM(数量) FOR 日期 IN('+@s+')) b
    ')
    /*单号          2009-03-04  2009-03-05  2009-03-06
    ----------- ----------- ----------- -----------
    1           10          17          0
    2           0           12          16(2 行受影响)
    */
      

  2.   

    --> 生成测试数据表: [tb]
    IF OBJECT_ID('[tb]') IS NOT NULL
        DROP TABLE [tb]
    GO
    CREATE TABLE [tb] ([单号] [int],[日期] [datetime],[数量] [int])
    INSERT INTO [tb]
    SELECT '1','2009-03-04','10' UNION ALL
    SELECT '1','2009-03-05','15' UNION ALL
    SELECT '1','2009-03-05','2' UNION ALL
    SELECT '2','2009-03-05','12' UNION ALL
    SELECT '2','2009-03-06','12' UNION ALL
    SELECT '2','2009-03-06','4'--SELECT * FROM [tb]-->SQL2000查询如下:
    DECLARE @s VARCHAR(8000)
    SELECT @s=ISNULL(@s,'')
     +',SUM(CASE 日期 WHEN '''+CONVERT(VARCHAR,日期,23)+''' THEN 数量 ELSE 0 END)['+CONVERT(VARCHAR,日期,23)+']'
    FROM tb 
    GROUP BY CONVERT(VARCHAR,日期,23)
    EXEC('SELECT 单号'+@s+' FROM tb GROUP BY 单号')
    /*
    单号          2009-03-04  2009-03-05  2009-03-06
    ----------- ----------- ----------- -----------
    1           10          17          0
    2           0           12          16(2 行受影响)
    */