【问题标题】:How to convert row to columns?如何将行转换为列?
【发布时间】:2013-06-12 05:02:48
【问题描述】:

我有下表:

  PROCESS ID       VOUCHER DATE     CATEGORY_ID     PROJECT     AMOUNT
  -----------      ------------    ------------     -------     -------
  1001             12/03/13         Miscellaneous   pnr         1000
  1001             12/03/13         Miscellaneous   pjk         2000
  1002             20/07/13         Local Travel    pnr         3000
  1002             20/07/13         Local Travel    npk         3400
  1003             29/09/14         Miscellaneous   jpg         1000
  1004             23/10/13         Local Travel    pnr         2000
  1005             24/10/13         Miscellaneous   pnr         1000
  1005             24/10/13         Local Travel    pnr         1000

在界面中,我将给出 VOUCHER DATE 介于某个日期之间,例如 20/01/1327/10/13 和我必须得到如下格式的输出:

  CATEGORY_ID       pnr         npk         jpg
  -----------      -----       -----       -----      
  Miscellaneous    1000         0           1000
  Local Travel     6000         3400        0

项目是动态的,可以变化。

【问题讨论】:

    标签: sql vb.net winforms sql-server-ce pivot


    【解决方案1】:

    试试这个,它适用于 SQL Server 2008:

    DECLARE @cols AS NVARCHAR(MAX),
        @query  AS NVARCHAR(MAX)
    
    SELECT @cols = STUFF((SELECT ',' + PROJECT
                        FROM (SELECT DISTINCT PROJECT FROM Table1 )sub
                       FOR XML PATH(''), TYPE
                ).value('.', 'NVARCHAR(MAX)') 
            ,1,1,'')
    
    
    SET @query = 'SELECT * FROM
                    (
                    SELECT CATEGORY_ID, PROJECT, AMOUNT 
                    FROM Table1   
                    --WHERE VOUCHER_DATE BETWEEN '' AND ''
                    ) AS T1
                    PIVOT (SUM(AMOUNT) FOR PROJECT IN ('+@cols+')) AS T2
    
    '
    EXEC(@query)
    

    SQL Fiddle

    基本上,您使用动态 SQL 来设置项目列表,因为它可能会有所不同,然后像往常一样 PIVOT,我注释掉了凭证日期标准,因为示例日期的格式不正确。如果某些项目完全被日期要求排除在外,那么您还将日期标准添加到设置项目列表的顶部。

    【讨论】:

    • 如何使用 SqlCe 连接对 .sdf 文件执行此操作,因为它们不能支持存储过程
    • 我不熟悉SQLCE的局限性,有时间再研究一下。
    【解决方案2】:

    如果项目列的值的数量已知并且它们也很少,您可以试试这个:

    select category_id
        ,sum(case when project='pnr' then amount else 0. end) as pnr
        ,sum(case when project='npk' then amount else 0. end) as npk
        ,sum(case when project='jpg' then amount else 0. end) as jpg
    from [yourtable]
    where [voucher date] between @bd and @ed--@bd and @ed are the input interval
    group by category_id
    

    或者玩枢轴命令

    谢谢

    【讨论】:

    • 感谢您的回复,项目列值未知。所以这是不可能的
    猜你喜欢
    • 2011-12-21
    • 1970-01-01
    • 2014-08-30
    • 2016-10-25
    相关资源
    最近更新 更多