Member 10626601 Ответов: 2

Как обрабатывать оператор null in case в SQL server


Выберите Prov. ProvinceName, CASE WHEN P. ProjectTypeID = 2 THEN COUNT(*) END Road,
Сумма (случай, когда P. ProjectTypeID = 2, то PP. Quantity ELSE 0 END) км,
Случай, когда P. ProjectTypeID = 1, то COUNT (*) END Bridge,
Сумма (случай, когда P. ProjectTypeID = 1, то PP. Quantity ELSE 0 END) RM,
Случай, когда P. ProjectTypeID = 3, то COUNT (*) END Building
Из проекта Р
Внутреннее соединение ProjectPRA п. п. п. параметр projectid = ПП.Параметр projectid
Внутреннее соединение zDistrict D на P. District = D. District
Внутреннее соединение zProvince пер. д. ProvinceID = пров.ProvinceID
ГДЕ PP. PRAID=3
Группа по P. ProjectTypeID, Prov. ProvinceName

вон положил
--- Я не хочу, чтобы NULL повторялся
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


Что я уже пробовал:

Я пробовал подзапрос, наружное применение, Союз и различные заявления в заявление случае SQL

2 Ответов

Рейтинг:
0

Rahul_Biswas

Попробовать это:

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


Member 10626601

Спасибо вам от вашего времени но оно также повторяет название провинции

Рейтинг:
0

Wendelius

Во-первых, если вы выполняете запрос в SSMS, текст NULL просто уведомляет вас о том, что ячейка не имеет фактического значения. Если вы собираетесь запустить оператор в какой-то другой программе, он может показывать нулевые значения по-другому. Если вы собираетесь запустить оператор в своей собственной программе, то при получении нулевых значений вы можете решить, как их показать.

Сказав это, если вы хотите изменить выходные данные с помощью 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


Проблема в том, что теперь трудно понять, возвращается ли 0, потому что счетчик возвращает 0 или потому что значение равно NULL. Одним из способов решения этой проблемы было бы преобразование значений в символьные данные и использование пустой строки в случае null, например
...
COALESCE( CAST( CASE WHEN P.ProjectTypeID = 1 THEN COUNT(*) END AS varchar(100)), 0) Bridge,
...

Но теперь мы делаем чрезмерное форматирование, и SQL на самом деле не предназначен для этого...


Member 10626601

Хэнк ты из своего времени но он также повторяет название провинции

Wendelius

Вы хотите сказать, что не хотите повторять название провинции, если оно такое же, как в предыдущей строке? Если это так, то взгляните на Как форматировать повторяющиеся значения в результирующем наборе SQL[^]