2016-02-20 2 views
1

Я хочу объединить строки с соответствующими идентификаторами, возвращающимися из инструкции SELECT CASE. Я использую pgAdmin 3 в базе данных PG-9.3.4.SQL - консолидировать строки после инструкции SELECT CASE

Это то, что я получаю на pgAdmin: query result

И это то, что я хочу получить: expected result

Я попытался группировки, или присоединение к результату к самому столу, но не работают. Есть идеи?

Мой код запроса:

SELECT 
    CASE 
    WHEN t1.material LIKE '%Refuse%' 
     THEN t1.disposal 
    ELSE NULL 
END AS msw_disp, 

    CASE 
    WHEN t1.material LIKE '%Met%' 
     THEN t1.disposal 
    ELSE NULL 
END AS mgp_disp, 

    CASE 
    WHEN t1.material LIKE '%Paper%' 
     THEN t1.disposal 
    ELSE NULL 
END AS pap_disp, t1.district 

FROM dsny_net t1 

ответ

0

Добавление Aggregate и Group by к текущему запросу должен получить работу

SELECT Max(CASE 
      WHEN t1.material LIKE '%Refuse%' THEN t1.disposal 
      END) AS msw_disp, 
     Max(CASE 
      WHEN t1.material LIKE '%Met%' THEN t1.disposal 
      END) AS mgp_disp, 
     Max(CASE 
      WHEN t1.material LIKE '%Paper%' THEN t1.disposal 
      END) AS pap_disp, 
     t1.district 
FROM dsny_net t1 
GROUP BY t1.district 
0

Так же, как альтернатива:

select 
    district, 
    unnest(array_agg(disposal) filter (where material like '%Refuse%')) as msw_disp, 
    unnest(array_agg(disposal) filter (where material like '%Met%')) as mgp_disp, 
    unnest(array_agg(disposal) filter (where material like '%Paper%')) as pap_disp, 
from dsny_net 
group by district; 

Использование max воли капель все остальные значения (если есть), кроме макс.

Однако unnest(array_agg(disposal) filter (where material like ...)) as ... может быть заменен на max(disposal) filter (where material like ...) as.., чтобы сделать запрос более короткий.

Смежные вопросы