Примеры использования значений в списке - PullRequest
1 голос
/ 05 февраля 2020

У меня есть таблица, которая выглядит следующим образом после выполнения определенных объединений:

create table test(id varchar(10), sub varchar(20));

insert into test values(1,'a')
insert into test values(1,'b')
insert into test values(2,'a')
insert into test values(3,'a')
insert into test values(3,'c')

Я хочу посмотреть, какие значения имеет конкретный идентификатор в подстолбце, и вывести следующее (ожидаемые результаты):

1,'both a and b'
2,'only a'
3,'both a and c'

Я попробовал следующее:

select id, case when sub in ('a') then 'only a'
when sub in ('a','b') then 'both a and b')
else 'only b'
end as subs from test group by 1,2;

Любая помощь будет оценена.

Ответы [ 5 ]

0 голосов
/ 05 февраля 2020

Странные результаты. Я бы предпочел иметь полный список. Но в любом случае:

select id,
       (case when max(sub) = min(sub) 
             then 'only ' || min(sub)
             when count(distinct sub) = 2
             then 'both ' || min(sub) || ' and ' || max(sub)
             else 'I don''t have that many fingers.
        end)
from test t
group by id;

Если вы хотите полный список, используйте listagg():

select id, listagg(distinct sub, ',') within group (order by sub)
from test t
group by id;
0 голосов
/ 05 февраля 2020

Вы можете выполнить агрегацию:

select id, (case when max(sub) = min(sub) and min(sub) = 'a' 
                 then 'only a'
                 when max(sub) = min(sub) and min(sub) = 'b'  
                 then 'only b'
                 when max(sub) <> min(sub)
                 then 'both a and b' 
            end)
from test t
where t.sub in ('a', 'b')
group by id;

РЕДАКТИРОВАТЬ: Удалено where предложение и сделать конкат.

select id, (case when max(sub) = min(sub) 
                 then 'only' || min(sub)
                 when max(sub) <> min(sub)
                 then 'multiple'
            end)
from test t
group by id;
0 голосов
/ 05 февраля 2020

Вы можете сделать самостоятельное соединение:

SELECT 
    ta.id, 
    CASE WHEN ta.id is NULL THEN
        CASE WHEN tb.id IS NULL then 'neither' ELSE '"b" only'
    ELSE 
        CASE WHEN tb.id IS NULL then '"a" only' ELSE '"a" and "b"'
    END AS summary
FROM test ta
FULL OUTER JOIN test tb
ON ta.id = tb.id AND tb.sub = 'b'
WHERE ta.sub='a'
0 голосов
/ 05 февраля 2020

Если вы можете использовать sql сервер, попробуйте это решение

SELECT 
   SS.id,
   STUFF((SELECT 'and' + SS.sub
          FROM test ts 
          WHERE ts.id = SS.id
          FOR XML PATH('')), 1, 1, '') [sub]
FROM test SS
GROUP BY SS.id
ORDER BY 1
0 голосов
/ 05 февраля 2020

для sql сервера:

Вы можете использовать, он перечислит подпрограмму с идентификатором

select distinct id ,
STUFF((Select ','+sub
from #test T1
where T1.id=T2.id
FOR XML PATH('')),1,1,'') from #test T2
where id = 3

Для postgres, используйте

SELECT
    id,
    ARRAY_AGG (sub) as sugagg
from #test T1
GROUP BY
    id
...