zoukankan      html  css  js  c++  java
  • Using SQL Server 2005/2008 Pivot on Unknown Number

    2005/2008, the Pivot relationnal operator is used to convert rows into columns data. This feature is frequently used in reports and is pretty easy to work with.

    Available in SQL Server 2005/2008, the Pivot relationnal operator is used to convert rows into columns data. This feature is frequently used in reports and is pretty easy to work with.

    Here is a example :
    We have a table Product, if we execute this simple query :
    1
    2
    SELECT productId,_year,amount
    FROM Products

    We have this result :

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    productId   _year   amount
    124         2001    125
    125         2001    454
    126         2001    75
    127         2002    256
    128         2004    457
    129         2004    585
    130         2002    142
    131         2002    785
    132         2005    452
    133         2005    864
    134         2005    762
    135         2004    425
    136         2003    452
    137         2003    1024
    138         2003    575

    Now we are going to use PIVOT to have the years as columns and for a productId, the sum of amounts for 2001 and 2003 :

    1
    2
    3
    4
    5
    6
    7
    SELECT * FROM
    (
        SELECT productId,_year,amount
        FROM Products
    )t
    PIVOT (SUM(amount) FOR _year
    IN ([2001],[2003])) AS pvt

    So, we will have this result :

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    productId   2001    2003
    124         125     NULL
    125         454     NULL
    126         75      NULL
    127         NULL    NULL
    128         NULL    NULL
    129         NULL    NULL
    130         NULL    NULL
    131         NULL    NULL
    132         NULL    NULL
    133         NULL    NULL
    134         NULL    NULL
    135         NULL    NULL
    136         NULL    452
    137         NULL    1024
    138         NULL    575

    Ok, that’s nice. But if we consider that we don’t know the names of the columns, we have to make our PIVOT dynamic. Look at the following code :

    We are first going to build a string that concatenes all years

    1
    2
    3
    4
    5
    6
    7
    DECLARE @years VARCHAR(2000)
    SELECT  @years = STUFF(( SELECT DISTINCT
                            '],[' + ltrim(str(_year))
                            FROM    Products
                            ORDER BY '],[' + ltrim(str(YEAR(_year)))
                            FOR XML PATH('')
                            ), 1, 2, '') + ']'

    So this string will contain all years needed for our PIVOT query:

    1
    [2001],[2002],[2003],[2004],[2005]

    After that, all we have to do is to dynamically create our PIVOT query. Here is the complete query :

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    DECLARE @query VARCHAR(4000)
    DECLARE @years VARCHAR(2000)
    SELECT  @years = STUFF(( SELECT DISTINCT
                            '],[' + ltrim(str(_year))
                            FROM    Products
                            ORDER BY '],[' + ltrim(str(YEAR(_year)))
                            FOR XML PATH('')
                            ), 1, 2, '') + ']'
     
    SET @query =
    'SELECT * FROM
    (
        SELECT productId,_year,amount
        FROM Products
    )t
    PIVOT (SUM(amount) FOR _year
    IN ('+@years+')) AS pvt'
     
    EXECUTE (@query)

    And here is the displayed result :

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    productId   2001    2002    2003    2004    2005
    124         125     NULL    NULL    NULL    NULL
    125         454     NULL    NULL    NULL    NULL
    126         75      NULL    NULL    NULL    NULL
    127         NULL    256     NULL    NULL    NULL
    128         NULL    NULL    NULL    457     NULL
    129         NULL    NULL    NULL    585     NULL
    130         NULL    142     NULL    NULL    NULL
    131         NULL    785     NULL    NULL    NULL
    132         NULL    NULL    NULL    NULL    452
    133         NULL    NULL    NULL    NULL    864
    134         NULL    NULL    NULL    NULL    762
    135         NULL    NULL    NULL    425     NULL
    136         NULL    NULL    452     NULL    NULL
    137         NULL    NULL    1024    NULL    NULL
    138         NULL    NULL    575     NULL    NULL

    Enjoy ;) PS : You might have this error message when you run the query :

    Incorrect syntax near ‘PIVOT’. You may need to set the compatibility level of the current database to a higher value to enable this feature. See help for the stored procedure sp_dbcmptlevel.

    So, to enable this feature, you have to set the compatibility level of your database to a higher level by using the following stored procedure :

    1
    2
    3
    4
    --If you are running SQL 2005
    EXEC sp_dbcmptlevel 'myDatabaseName', 90
    --If you are running SQL 2008
    EXEC sp_dbcmptlevel 'myDatabaseName', 100
  • 相关阅读:
    滴滴 cubeui 教程
    继往开来的 sass 3 代编译器:ruby sass、nodesass、dartsass
    研究大佬用 Vue 写的倒计时组件,学到了不少东西
    狠人!标星 3.4 万的项目说删就删,几行代码搞崩数万个开源项目
    本人EE知识体系导航 Embedded menu
    PMP之思维――我的PMP备考之旅
    总有些瞬间,能温暖整个曾经
    不是一辈子的人,不说一辈子的话
    QImage对一般图像的处理
    从零开始系统深入学习android(已完成部分的目录带链接)
  • 原文地址:https://www.cnblogs.com/happy-Chen/p/3623297.html
Copyright © 2011-2022 走看看