Click here to Skip to main content
15,886,873 members
Please Sign up or sign in to vote.
5.00/5 (1 vote)
See more:
SELECT Prov.ProvinceName, CASE WHEN P.ProjectTypeID = 2 THEN COUNT(*) END Road,
SUM(CASE WHEN P.ProjectTypeID = 2 THEN PP.Quantity ELSE 0 END) KM,
CASE WHEN P.ProjectTypeID = 1 THEN COUNT(*) END Bridge,
SUM(CASE WHEN P.ProjectTypeID = 1 THEN PP.Quantity ELSE 0 END) RM,
CASE WHEN P.ProjectTypeID = 3 THEN COUNT(*) END Building
FROM Project P
INNER JOIN ProjectPRA PP ON P.ProjectID = PP.ProjectID
INNER JOIN zDistrict D ON P.DistrictID = D.DistrictID
INNER JOIN zProvince Prov ON D.ProvinceID = Prov.ProvinceID
WHERE PP.PRAID=3
GROUP BY P.ProjectTypeID,Prov.ProvinceName

out put
--- I don't want NULL to be repeated
C#
Badakhshan	NULL	0	3	100	NULL
Badakhshan	8	95	NULL	0	NULL
Badghis	NULL	0	2	48	NULL
Badghis	1	15	NULL	0	NULL
Baghlan	NULL	0	2	83	NULL
Baghlan	8	62	NULL	0	NULL
Balkh	2	14	NULL	0	NULL
Bamyan	NULL	0	4	151	NULL
Bamyan	13	116	NULL	0	NULL
Daikundi	NULL	0	5	150	NULL
Daikundi	23	236	NULL	0	NULL
Daikundi	NULL	0	NULL	0	1
Farah	6	44	NULL	0	NULL
Faryab	NULL	0	7	262	NULL
Faryab	11	134	NULL	0	NULL
Ghazni	5	60	NULL	0	NULL
Ghor	NULL	0	1	60	NULL
Ghor	4	77	NULL	0	NULL
Helmand	2	30	NULL	0	NULL
Jowzjan	NULL	0	1	25	NULL
Jowzjan	5	57	NULL	0	NULL
Kabul	NULL	0	2	87	NULL
Kabul	4	25	NULL	0	NULL
Kabul	NULL	0	NULL	0	2
Kandahar	NULL	0	2	370	NULL
Kandahar	2	11	NULL	0	NULL
Khost	NULL	0	10	730	NULL
Khost	1	20	NULL	0	NULL
Kunar	13	126	NULL	0	NULL
Kunduz	NULL	0	1	80	NULL
Kunduz	13	94	NULL	0	NULL
Logar	NULL	0	2	70	NULL
Logar	1	10	NULL	0	NULL
Nengarhar	2	24	NULL	0	NULL
Nimroz	NULL	0	1	70	NULL
Nimroz	5	43	NULL	0	NULL
Nuristan	NULL	0	4	108	NULL
Nuristan	16	166	NULL	0	NULL
Paktika	2	21	NULL	0	NULL
Paktya	NULL	0	9	169	NULL
Paktya	3	45	NULL	0	NULL
Panjsher	NULL	0	1	60	NULL
Panjsher	1	9	NULL	0	NULL
Parwan	NULL	0	2	38	NULL
Samangan	1	13	NULL	0	NULL
Takhar	NULL	0	3	92	NULL
Takhar	8	74	NULL	0	NULL
Urozgan	2	40	NULL	0	NULL
Wardak	NULL	0	1	40	NULL
Wardak	2	16	NULL	0	NULL
Zabul	NULL	0	1	40	NULL
Zabul	1	10	NULL	0	NULL


What I have tried:

I have tried sub query, outer apply, union and different statement in sql case statement
Posted
Updated 26-Oct-16 7:16am

Try this:
SQL
SELECT Prov.ProvinceName
	,CASE 
		WHEN P.ProjectTypeID = 2
			THEN COUNT(*)
		--Adding ELSE to cancel out the NULL
		ELSE 0
		END Road
	,SUM(CASE 
			WHEN P.ProjectTypeID = 2
				THEN PP.Quantity
			ELSE 0
			END) KM
	,CASE 
		WHEN P.ProjectTypeID = 1
			THEN COUNT(*)
		--Adding ELSE to cancel out the NULL
		ELSE 0
		END Bridge
	,SUM(CASE 
			WHEN P.ProjectTypeID = 1
				THEN PP.Quantity
			ELSE 0
			END) RM
	,CASE 
		WHEN P.ProjectTypeID = 3
			THEN COUNT(*)
		--Adding ELSE to cancel out the NULL
		ELSE 0		
		END Building
FROM Project P
INNER JOIN ProjectPRA PP ON P.ProjectID = PP.ProjectID
INNER JOIN zDistrict D ON P.DistrictID = D.DistrictID
INNER JOIN zProvince Prov ON D.ProvinceID = Prov.ProvinceID
WHERE PP.PRAID = 3
GROUP BY P.ProjectTypeID
	,Prov.ProvinceName
 
Share this answer
 
Comments
Member 10626601 28-Oct-16 23:21pm    
Thank you from your time but it also repeating the province name
First of all, if you're running the query in SSMS, the text NULL is just to notify you that the cell has no actual value. If you're going to run the statement in some other program it may show NULL values differently. If you're going to run the statement in your own program, when you receive the NULL values, you can decide how to show them.

Having that said, if you want to modify the output using SQL, one easy way is to use COALESCE[^] function which returns the first non null value. For example the query could look something like
SQL
SELECT Prov.ProvinceName, 
       COALESCE( CASE WHEN P.ProjectTypeID = 2 THEN COUNT(*) END, 0) Road,
       COALESCE( SUM(CASE WHEN P.ProjectTypeID = 2 THEN PP.Quantity ELSE 0 END), 0) KM,
       COALESCE( CASE WHEN P.ProjectTypeID = 1 THEN COUNT(*) END, 0) Bridge,
       COALESCE( SUM(CASE WHEN P.ProjectTypeID = 1 THEN PP.Quantity ELSE 0 END), 0) RM,
       COALESCE( CASE WHEN P.ProjectTypeID = 3 THEN COUNT(*) END, 0) Building
FROM Project P
INNER JOIN ProjectPRA PP ON P.ProjectID = PP.ProjectID
INNER JOIN zDistrict D ON P.DistrictID = D.DistrictID
INNER JOIN zProvince Prov ON D.ProvinceID = Prov.ProvinceID
WHERE PP.PRAID=3 
GROUP BY P.ProjectTypeID,Prov.ProvinceName


The problem is that it's now hard to know if 0 is returned because the COUNT returns 0 or because the value is NULL. One way to tackle this would be to convert the values to character data and use an empty string in case of null, for example
SQL
...
COALESCE( CAST( CASE WHEN P.ProjectTypeID = 1 THEN COUNT(*) END AS varchar(100)), 0) Bridge,
...

But now we're doing excessive formatting and SQL isn't really designed for this...
 
Share this answer
 
Comments
Member 10626601 28-Oct-16 23:21pm    
hank you from your time but it also repeating the province name
Wendelius 29-Oct-16 14:51pm    
You mean you don't want to repeat province name if it's the same as on the previous row? If that's the case, have a look at How to Format Repeating Values in SQL Result Set[^]

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