Solved

Crosstab query SQL Server

Posted on 2011-09-23
6
234 Views
Last Modified: 2012-05-12
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

0
Comment
Question by:koossa
[X]
Welcome to Experts Exchange

Add your voice to the tech community where 5M+ people just like you are talking about what matters.

  • Help others & share knowledge
  • Earn cash & points
  • Learn & ask questions
  • 3
  • 2
6 Comments
 
LVL 15

Expert Comment

by:Anuj
ID: 36585676
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
 
LVL 15

Expert Comment

by:Anuj
ID: 36585685
0
 

Author Comment

by:koossa
ID: 36586107
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
Best Practices: Disaster Recovery Testing

Besides backup, any IT division should have a disaster recovery plan. You will find a few tips below relating to the development of such a plan and to what issues one should pay special attention in the course of backup planning.

 
LVL 15

Accepted Solution

by:
Anuj earned 500 total points
ID: 36586377
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
 
LVL 40

Expert Comment

by:lcohan
ID: 36587380
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
 

Author Closing Comment

by:koossa
ID: 36595378
Thank you
0

Featured Post

Industry Leaders: We Want Your Opinion!

We value your feedback.

Take our survey and automatically be enter to win anyone of the following:
Yeti Cooler, Amazon eGift Card, and Movie eGift Card!

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Suggested Solutions

Title # Comments Views Activity
How can I find this data? 3 31
help converting varchar to date 14 25
How come this XML node is not read? 3 32
Trigger C# code inside the SQL Server 6 36
Load balancing is the method of dividing the total amount of work performed by one computer between two or more computers. Its aim is to get more work done in the same amount of time, ensuring that all the users get served faster.
In this article we will learn how to fix  “Cannot install SQL Server 2014 Service Pack 2: Unable to install windows installer msi file” error ?
Familiarize people with the process of utilizing SQL Server functions from within Microsoft Access. Microsoft Access is a very powerful client/server development tool. One of the SQL Server objects that you can interact with from within Microsoft Ac…
Viewers will learn how to use the INSERT statement to insert data into their tables. It will also introduce the NULL statement, to show them what happens when no value is giving for any given column.

696 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question