Convert Access CROSSTAB query to SQL Table or View

I have a Crosstab query that I need to convert to SQL to complete upsize of a large DB.
I have a table (here referred to as Data) with the fields: Resource, Date and Count. I need to transform it to a table (or view) with a fields called Date, and one field for each Resource that exists in the Data table.

The Data table looks like this:
RES DATE COUNT
res1 Jan06 5
res2 Jan06 4
res3 Jan 06 2
res1 Feb06 9
res2 Feb06 5
res3 Feb06 7

etc


The Access crosstab query sql is:
=====================
TRANSFORM Sum(Data.Count) AS SumOfCount
SELECT Data.Date
FROM Data
GROUP BY Data.Date
ORDER BY Data.Date
PIVOT Data.Resource;

which gives the resultant data set for charting:
Date res1 res2 res3
Jan06 5 4 2
Feb06 9 5 7

TRANSFORM is not T-SQL. I assume I need a usp to create the required table. Any ideas please

George Cooper.



Answer this question

Convert Access CROSSTAB query to SQL Table or View

  • jasonva

    But if the number of destination columns (res1, res2, res3,...,resN) is unknown

    Using SqlServer 2000.

     

    Later i found these great article:
    http://www.sqlservercentral.com/columnists/plarsson/pivottableformicrosoftsqlserver.asp

     


  • Naldiian

    There is an interesting article on this issue at:
    http://tinyurl.com/mgrwo




  • omar seyam

    Thanks,

    Pivot soultion works well.

    Regards\

    George Cooper


  • -chin-

    In SQL Server, you can use either CASE statement to pivot the table or PIVOT function in SQL Server 2005.

    Here is CASE solution:

    SELECT sDate,
    AVG(CASE WHEN res ='res1' THEN sCount END) as res1,
    AVG(CASE WHEN res ='res2' THEN sCount END) as res2,
    AVG(CASE WHEN res ='res3' THEN sCount END) as res3
    FROM (SELECT sDate, res, sCount FROM myDATA) p
    WHERE res IN ('res1', 'res2', 'res3')
    GROUP BY sDate
    ORDER By Convert(DATETIME,'01'+sDate,13)

    PIVOT solution:(SQL Server 2005)

    SELECT sDate, res1, res2, res3
    FROM (SELECT sDate, res, sCount FROM myDATA) p
    PIVOT (AVG(sCount) FOR res IN ([res1], [res2], [res3])) AS pvt
    ORDER By Convert(DATETIME,'01'+sDate,13)

    You need to pay attention to your so-called Date column. I convert the text (nvarchar) field to datetime for sorting purpose.


  • Convert Access CROSSTAB query to SQL Table or View