SELECT GROUP_BY и GROUP_CONCAT одинаковые значения в таблице, только если одно из значений имеет поле NULL - PullRequest
0 голосов
/ 06 сентября 2018

У меня есть таблица, полная имен и адресов. Я хочу объединить (group_concat) все строки, которые имеют одинаковые значения для города и названия города, но только если один из адресов имеет значение NULL. Например, у меня может быть эта таблица:

name     |    addr    |  city  | state  | phone 

jon snow | 123 got st |  la    | CA     | 1234567890
jon snow | NULL       |  la    | CA     | 1225556789
walker   | 777 diff ln|  la    | CA     | 4556678899
walker   |456 crown rd|  la    | CA     | 33344455566

Я бы хотел, чтобы результат был:

name     |    addr    |  city  | state  | phone

jon snow | 123 got st |  la    | CA     | 1234567890,1225556789
walker   | 777 diff ln|  la    | CA     | 4556678899
walker   |456 crown rd|  la    | CA     | 33344455566

В настоящее время я использую следующую команду:

SELECT name, group_concat(distinct(addr)) as addr, city, state, group_concat(distinct phone) as phone from got_table group by name, city, state having count(*) >1;

В результате объединяются все адреса с одинаковым именем, городом, штатом, даже если есть два ненулевых адреса. Результат вышеприведенного утверждения выглядит следующим образом:

name     |    addr                  |  city  | state  | phone

jon snow | 123 got st               |  la    | CA     | 1234567890,1225556789
walker   | 777 diff ln, 456 crown rd|  la    | CA     | 4556678899, 33344455566

Есть ли способ объединить, только если один из адресов строки равен NULL, и выполнять этот group_concat, только если совпадают только 2 строки.

1 Ответ

0 голосов
/ 06 сентября 2018

Вы можете попытаться сгруппировать по CASE WHEN с подзапросом, чтобы сделать его.

проверить addr столбец: NULL получить.

  1. addr IS NULL получитьMAX значение или ваша ожидаемая группа по значению concat.
  2. addr НЕТ НУЛЬ = get addr

выглядит следующим образом.

CREATE TABLE got_table(
   name varchar(50),
   addr varchar(50),
  city varchar(50),
    state varchar(50),
    phone varchar(50)
); 


insert into got_table values ('jon snow','123 got st'  ,'la', 'CA', '1234567890');
insert into got_table values ('jon snow',NULL          ,'la', 'CA', '1225556789');
insert into got_table values ('walker','777 diff ln' ,'la', 'CA'  , '4556678899');
insert into got_table values ('walker','456 crown rd','la', 'CA'  , '33344455566');

Запрос 1 :

SELECT name,
       case when addr is null then
       (
         SELECT MAX(tt.addr) 
         FROM got_table tt
         WHERE t1.name = tt.name 
         and t1.city = tt.city 
         and t1.state = tt.state
       ) else addr end as address,
       city, 
       state, 
       group_concat(distinct phone) as phone 
from got_table t1
group by name, city, state,address

Результаты :

|     name |      address | city | state |                 phone |
|----------|--------------|------|-------|-----------------------|
| jon snow |   123 got st |   la |    CA | 1225556789,1234567890 |
|   walker | 456 crown rd |   la |    CA |           33344455566 |
|   walker |  777 diff ln |   la |    CA |            4556678899 |
...