#sql #sql-server #group-by
#sql #sql-сервер #группировка по
Вопрос:
У меня есть таблица адресов со столбцами: A, B, C, D……Адрес, номер, штат, город, почтовый индекс**
Мне нужно получить количество различных адресов, которые могут быть сгруппированы по 2 различным условиям:
(Адрес, номер, штат, город) ИЛИ (адрес, номер, почтовый индекс)
Причина для 2 условий заключается в том, что почтовый индекс может быть нулевым в некоторых случаях с указанием города и штата, и наоборот. Однако в тех случаях, когда присутствуют все 3, в итоговой таблице должна быть только 1 строка для этого адреса
select State, City, Address, Number
into T1
from Main Table
group by State, City, Address, Number
select Zip, Address, Number
into T2
from Main Table
group by Zip, Address, Number
select a.*, b.Zip into JoinT1T2 from T1 a inner join T2 b
on a.Address=b.Address AND a.Number=b.Number
select count(*) from JoinT1T2
Но это не дает мне желаемого результата.
Комментарии:
1. Покажите нам некоторые примеры данных и ожидаемые результаты!
2. Вам нужна «итоговая таблица», удовлетворяющая какому-либо условию, или вам нужно количество? Это два разных результата.
3. @Fred Мне нужны подсчеты в итоговой таблице.
Ответ №1:
Вы можете создать новое поле с именем TypeOfDir, используя CASE
инструкцию, чтобы получить значение от 1 до 3 для различных условий, которые у вас есть. Затем вы можете сгруппироваться по этому новому полю.
Комментарии:
1. Я не уверен, что понял. У нас есть только 2 условия.
2. Вы описали три условия: нет почтового индекса, кроме города / штата, нет города / штата, но Zip, как Zip, так и City / State.
3. Как сказал Фред, у вас есть эти три условия.
Ответ №2:
Что вам нужно сделать, это определить условие как дополнительный столбец. Вам не нужно добавлять это в таблицу (хотя это повысит производительность), вы можете сделать это на лету, если хотите, с помощью CROSS APPLY
.
SELECT COUNT(*) FROM (
SELECT DISTINCT HasZip, State, City, Zip, Address, Number
FROM Table t
CROSS APPLY (VALUES (CASE WHEN Zip IS NULL THEN 0 ELSE 1 END) ) v(HasZip)
) t