Click here to Skip to main content
15,891,033 members
Please Sign up or sign in to vote.
0.00/5 (No votes)
My Table:
Month	    Nr of Projects	Amount	     Ab-,Zugang
2014-05-01	      8	        3004	       Abgang
2014-02-01	      5	        2314	       Abgang
2014-11-01	     10	        1366	       Zugang
2014-01-01	     1	        37443	       Zugang
2014-07-01	     7	        18400	       Zugang 
2014-12-01	     3	        1500	       Abgang
2014-06-01	     11	        2000	       Zugang
2014-09-01	     9	        8000	       Zugang
2014-03-01	     5	        2555	       Zugang
2014-01-01	     2	        5000	       Zugang
2014-03-01	     7	        7000	       Zugang


My Expectation:
Month_Quarter	Zugang	Total_Amount_Zugang	 Abgang	  Total_Amount_Abgang
    Q1	          4	          51998	           1	      2314
    Q2	          1	          2000	           1	      3004
    Q3	          3	          26000            0	       0
    Q4	          1	          1366	           1	      1500


My Statement:
SQL
SELECT 'Q'+cast([Month_Quarter] as varchar) Month_Quarter,COALESCE([Zugang],0) Zugang, COALESCE([Abgang],0) Abgang,[Total Amount] 
FROM
(
   SELECT DATEPART(QUARTER,MonthCol) [Month_Quarter],
          Ab_Zugang,
          Count(NoProjects) NoProjects,
          sum([Amount]) AS [Total Amount]
   FROM tblProjectData
   GROUP BY DATEPART(QUARTER,MonthCol), Ab_Zugang
 
 ) proj
 PIVOT (SUM(NoProjects) FOR Ab_Zugang IN (Zugang, Abgang)) As pvt
 ORDER BY Month_Quarter


BUT This is what my results looks like with the query above:
Month_Quarter	Zugang	Abgang	Total_Amount
    Q1	          0	       1	  2314
    Q1	          4	       0	  51998
    Q2	          1	       0	  2000
    Q2	          0	       1	  3004
    Q3	          0	       0	  NULL
    Q3	          3	       0	  26000
    Q4	          1	       0	  1366
    Q4	          0	       1	  1500


What I'm trying to realize ist: I want to know how many Zugang or Abgang are in each Quarter and the total amount to them. How can I edit the query to have my expectation results?
Posted

1 solution

Try this:
SQL
DECLARE @tmp TABLE(MonthCol	DATE,  [NoProjects] INT, [Amount] INT, [Ab_Zugang] VARCHAR(30))

INSERT INTO @tmp
VALUES('2014-05-01' , 8 , 3004 , 'Abgang'),
('2014-02-01' , 5 , 2314 , 'Abgang'),
('2014-11-01' , 10 , 1366 , 'Zugang'),
('2014-01-01' , 1 , 37443 , 'Zugang'),
('2014-07-01' , 7 , 18400 , 'Zugang'),
('2014-12-01' , 3 , 1500 , 'Abgang'),
('2014-06-01' , 11 , 2000 , 'Zugang'),
('2014-09-01' , 9 , 8000 , 'Zugang'),
('2014-03-01' , 5 , 2555 , 'Zugang'),
('2014-01-01' , 2 , 5000 , 'Zugang'),
('2014-03-01' , 7 , 7000 , 'Zugang')

SELECT [Month_Quarter] AS [Quarter], COALESCE(SUM([Zugang]),0) Zugang, SUM([ZugangAmount]) [ZugangAmount], COALESCE(SUM([Abgang]),0) Abgang, SUM([AbgangAmount]) [AbgangAmount]
FROM
(
   SELECT 'Q'+CONVERT(VARCHAR(5), DATEPART(QUARTER,MonthCol)) [Month_Quarter],
		CASE WHEN Ab_Zugang = 'Zugang' THEN COUNT(NoProjects) ELSE 0 END AS [Zugang], 
		CASE WHEN Ab_Zugang = 'Zugang' THEN SUM([Amount])  ELSE 0 END AS [ZugangAmount],
		CASE WHEN Ab_Zugang = 'Abgang' THEN COUNT(NoProjects) ELSE 0 END AS [Abgang], 
		CASE WHEN Ab_Zugang = 'Abgang' THEN SUM([Amount])  ELSE 0 END AS [AbgangAmount]
   FROM @tmp
   GROUP BY DATEPART(QUARTER,MonthCol), Ab_Zugang
 ) dt
 GROUP BY [Month_Quarter]


Result:
Quarter	Zugang	ZugangAmount	Abgang	AbgangAmount
Q1		4		51998			1		2314
Q2		1		2000			1		3004
Q3		2		26400			0		0
Q4		1		1366			1		1500


[EDIT]

The same result you can achieve by joining two pivots:
SQL
SELECT t1.[Quarter], t1.Zugang, t2.Zugang AS [ZugangAmount], t1.Abgang, t2.Abgang AS  [AbgangAmount]
FROM(
    SELECT [Quarter], [Abgang], [Zugang]
    FROM
    (
       SELECT 'Q'+CONVERT(VARCHAR(5), DATEPART(QUARTER,MonthCol)) [Quarter], [Ab_Zugang], NoProjects
       FROM @tmp
     ) dt1
     PIVOT(COUNT(NoProjects) FOR [Ab_Zugang] IN ([Abgang], [Zugang])) AS pvt1
) AS t1 INNER JOIN
    (
     SELECT [Quarter], [Abgang], [Zugang]
     FROM (
        SELECT 'Q'+CONVERT(VARCHAR(5), DATEPART(QUARTER,MonthCol)) AS [Quarter], [Ab_Zugang], [Amount]
        FROM @tmp
        ) dt2
     PIVOT(SUM([Amount]) FOR [Ab_Zugang] IN ([Abgang], [Zugang])) pvt2
     ) AS t2 ON t1.[Quarter] = t2.[Quarter]
 
Share this answer
 
v3
Comments
Sascha Lefèvre 23-Apr-15 5:40am    
+5.0000(0)1!
Maciej Los 23-Apr-15 5:42am    
Well...
Thank you, Sascha ;)
Maciej Los 23-Apr-15 5:42am    
--posted by mistake--
mikybrain1 23-Apr-15 5:55am    
Thnx :)
Maciej Los 23-Apr-15 6:14am    
You're very welcome, Miky ;)
See updated answer.

This content, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)



CodeProject, 20 Bay Street, 11th Floor Toronto, Ontario, Canada M5J 2N8 +1 (416) 849-8900