SQL Server - how to create a pivot from a select query

Collapse
X
 
  • Time
  • Show
Clear All
new posts
  • Radha Shyam
    New Member
    • Mar 2011
    • 9

    SQL Server - how to create a pivot from a select query

    Does anybody knows a simple way to create a pivot of this result:

    Code:
    [0-1]  [1-2]  [2-3]  [3-4]
    12      45      29    5
    This result is created with query:

    Code:
     SELECT [0-1]   = SUM(CASE WHEN AGE >= 0 AND AGE <= 1 THEN 1 ELSE 0 END),
           [1-2]  = SUM(CASE WHEN AGE > 1 AND AGE <= 2 THEN 1 ELSE 0 END),
           [2-3] = SUM(CASE WHEN AGE > 2 AND AGE <= 3 THEN 1 ELSE 0 END),
    [3-4] = SUM(CASE WHEN AGE > 3 AND AGE <= 4 THEN 1 ELSE 0 END)
        FROM dbo.Persons
    I want to show it like columns should become rows i.e it should be:

    Code:
    [0-1]    12
    [1-2]    45
    [2-3]    29
    Please suggest a simple and easy to follow solution.
    Last edited by Rabbit; Aug 21 '13, 04:01 PM. Reason: Please use code tags when posting code or formatted data.
  • tofos
    New Member
    • Aug 2013
    • 2

    #2
    Hi,

    try this:

    Code:
    SELECT
    	CASE WHEN AGE >= 0 AND AGE <= 1 THEN '[1-2]'
    			WHEN AGE > 2 AND AGE <= 3 THEN '[2-3]'
    			WHEN AGE > 3 AND AGE <= 4 THEN '[3-4]'
    			ELSE '[>4]' END Range
    	,count(CASE WHEN AGE >= 0 AND AGE <= 1 THEN '[1-2]'
    			WHEN AGE > 2 AND AGE <= 3 THEN '[2-3]'
    			WHEN AGE > 3 AND AGE <= 4 THEN '[3-4]'
    			ELSE '[>4]' END) Qty
    FROM dbo.Persons
    GROUP BY
    	CASE WHEN AGE >= 0 AND AGE <= 1 THEN '[1-2]'
    			WHEN AGE > 2 AND AGE <= 3 THEN '[2-3]'
    			WHEN AGE > 3 AND AGE <= 4 THEN '[3-4]'
    			ELSE '[>4]' END

    Comment

    • Rabbit
      Recognized Expert MVP
      • Jan 2007
      • 12517

      #3
      Please use code tags when posting code or formatted data.

      By the way, there's no need for the case within the count, you can just use count(*).

      Comment

      • Radha Shyam
        New Member
        • Mar 2011
        • 9

        #4
        Thank you tofos for your reply!
        This shows the count as expected but the only thing is the sort order. The result is:
        Range
        [1-2]
        [3-4]
        [2-3]
        [0-1]
        [>4]

        Can you suggest how can i show them as sorted ie. range [0-1] should come first followed by [1-2], [2-3] and so on.

        Can i add one more column as sort order and set order by on that.

        Please advise.

        Thanks

        Comment

        • tofos
          New Member
          • Aug 2013
          • 2

          #5
          Rabbit, thanks for advice.
          Radha, how about this:

          Code:
          SELECT
              CASE WHEN AGE >= 0 AND AGE <= 1 THEN '[0-1]'
          			WHEN AGE > 1 AND AGE <= 2 THEN '[1-2]'
                      WHEN AGE > 2 AND AGE <= 3 THEN '[2-3]'
                      WHEN AGE > 3 AND AGE <= 4 THEN '[3-4]'
                      ELSE '[4...]' END Range
              ,count(*) Qty
          FROM dbo.Persons
          GROUP BY
              CASE WHEN AGE >= 0 AND AGE <= 1 THEN '[0-1]'
          			WHEN AGE > 1 AND AGE <= 2 THEN '[1-2]'
                      WHEN AGE > 2 AND AGE <= 3 THEN '[2-3]'
                      WHEN AGE > 3 AND AGE <= 4 THEN '[3-4]'
                      ELSE '[4...]' END
          ORDER BY
          	CASE WHEN AGE >= 0 AND AGE <= 1 THEN '[0-1]'
          			WHEN AGE > 1 AND AGE <= 2 THEN '[1-2]'
                      WHEN AGE > 2 AND AGE <= 3 THEN '[2-3]'
                      WHEN AGE > 3 AND AGE <= 4 THEN '[3-4]'
                      ELSE '[4...]' END

          Comment

          Working...