Crosstab query SQL Server

I have a table:

Referred from                     ImpressionCount                      TimeStamp
--------------------------------------------------------------------------------------------
www.google.com                                      50                      2011-09-17
www.blabla.com                                         2                      2011-09-17
www.xyz.com                                           12                      2011-09-17
www.google.com                                      20                      2011-09-18
www.blabla.com                                         7                      2011-09-18
www.xyz.com                                           13                      2011-09-18
...............
...............
...............


How do I make it a crosstab query that gets the last 7 day's data and results look like

Referred from                                      2011-09-17            2011-09-18            2011-09-19  ...
--------------------------------------------------------------------------------------------------------------------------------------------------------
www.google.com                                          50                               20                           10
www.blabla.com                                             2                                 7                             8
www.xyz.com                                               12                                13                           10

koossaAsked:
Who is Participating?
 
AnujConnect With a Mentor SQL Server DBACommented:
This is dynamic Pivot query, you can create a stored procedure and include this code inside the stored procedure, later you can call the stored procedure in your application.
0
 
AnujSQL Server DBACommented:
For SQL Server 2005 and Above


CREATE TABLE CrossTab
(ReferredFrom VARCHAR(100),
 ImpressionCount INT,
 TStamp DATETIME)
 

DECLARE @SQL VARCHAR(MAX)
  , @Columns VARCHAR(MAX)
            
SET @Columns = STUFF((
                       SELECT DISTINCT
                                ',' + QUOTENAME(CONVERT(VARCHAR, tStamp, 105))
                                AS 'data()'
                       FROM     CrossTab
                     FOR
                       XML PATH('')
                     ), 1, 1, '')
                        
                                    
SET @SQL = N'SELECT ReferredFrom, ' + @Columns + '
FROM
(SELECT  ReferredFrom
      , ImpressionCount
      , CONVERT(VARCHAR,tStamp,105) tStamp
FROM    CrossTab) p
PIVOT
(
SUM(ImpressionCount)
FOR tStamp IN
( ' + @Columns + ' )
) AS pvt
'

EXEC ( @SQL
    )

Ref : Using Pivot and Unpivot

0
 
AnujSQL Server DBACommented:
0
Cloud Class® Course: Certified Penetration Testing

This CPTE Certified Penetration Testing Engineer course covers everything you need to know about becoming a Certified Penetration Testing Engineer. Career Path: Professional roles include Ethical Hackers, Security Consultants, System Administrators, and Chief Security Officers.

 
koossaAuthor Commented:
Isn't there a way of doing if with a select query?
I want to use it in my software using a select query?
0
 
lcohanDatabase AnalystCommented:
You can do it like in the example below by usint a temp table instead:

CREATE TABLE #test_table
        (
        Company  VARCHAR(3),
        Year     SMALLINT,
        Quarter  TINYINT,
        Amount   DECIMAL(2,1),
        Quantity DECIMAL(2,1)
        )
GO
 INSERT INTO #test_table
        (Company,Year, Quarter, Amount, Quantity)
 SELECT 'ABC', 2006, 1, 1.1, 2.2 UNION ALL
 SELECT 'ABC', 2006, 2, 1.2, 2.4 UNION ALL
 SELECT 'ABC', 2006, 3, 1.3, 1.3 UNION ALL
 SELECT 'ABC', 2006, 4, 1.4, 4.2 UNION ALL
 SELECT 'ABC', 2007, 1, 2.1, 2.3 UNION ALL
 SELECT 'ABC', 2007, 2, 2.2, 3.1 UNION ALL
 SELECT 'ABC', 2007, 3, 2.3, 2.1 UNION ALL
 SELECT 'ABC', 2007, 4, 2.4, 1.5 UNION ALL
 SELECT 'ABC', 2008, 1, 1.5, 5.1 UNION ALL
 SELECT 'ABC', 2008, 3, 2.3, 3.3 UNION ALL
 SELECT 'ABC', 2008, 4, 1.9, 4.2 UNION ALL
 SELECT 'XYZ', 2006, 1, 2.1, 3.6 UNION ALL
 SELECT 'XYZ', 2006, 2, 2.2, 1.8 UNION ALL
 SELECT 'XYZ', 2006, 3, 3.3, 2.6 UNION ALL
 SELECT 'XYZ', 2006, 4, 2.4, 3.7 UNION ALL
 SELECT 'XYZ', 2007, 1, 3.1, 1.9 UNION ALL
 SELECT 'XYZ', 2007, 2, 1.2, 1.2 UNION ALL
 SELECT 'XYZ', 2007, 3, 3.3, 4.2 UNION ALL
 SELECT 'XYZ', 2007, 4, 1.4, 4.0 UNION ALL
 SELECT 'XYZ', 2008, 1, 2.5, 3.9 UNION ALL
 SELECT 'XYZ', 2008, 2, 3.5, 2.1 UNION ALL
 SELECT 'XYZ', 2008, 3, 1.3, 3.9 UNION ALL
 SELECT 'XYZ', 2008, 4, 3.9, 3.4
GO


SELECT Company,
        Year,
        SUM(CASE WHEN Quarter = 1 THEN Amount   ELSE 0 END) AS Q1Amt,
        SUM(CASE WHEN Quarter = 1 THEN Quantity ELSE 0 END) AS Q1Qty,
        SUM(CASE WHEN Quarter = 2 THEN Amount   ELSE 0 END) AS Q2Amt,
        SUM(CASE WHEN Quarter = 2 THEN Quantity ELSE 0 END) AS Q2Qty,
        SUM(CASE WHEN Quarter = 3 THEN Amount   ELSE 0 END) AS Q3Amt,
        SUM(CASE WHEN Quarter = 3 THEN Quantity ELSE 0 END) AS Q3Qty,
        SUM(CASE WHEN Quarter = 4 THEN Amount   ELSE 0 END) AS Q4Amt,
        SUM(CASE WHEN Quarter = 4 THEN Quantity ELSE 0 END) AS Q4Qty,
        SUM(Amount)   AS TotalAmt,
        SUM(Quantity) AS TotalQty
   FROM #test_table
  GROUP BY Company, Year
  ORDER BY Company, Year


0
 
koossaAuthor Commented:
Thank you
0
Question has a verified solution.

Are you are experiencing a similar issue? Get a personalized answer when you ask a related question.

Have a better answer? Share it in a comment.

All Courses

From novice to tech pro — start learning today.