SQL-запрос: преобразовать строки в столбцы - PullRequest
1 голос
/ 20 июня 2019

Вот пример моей таблицы.

enter image description here

Мне нужно сделать запрос, который показывает те идентификаторы, которые имеют 0 в качестве платы за один из двух месяцев (11 или 12) или оба.

Так что из примера мне нужно показать ID 1,3,4, а не 2, как на скриншоте ниже.

enter image description here

Я попробовал запрос ниже:

SELECT 
    t1.id, t1.month, t1.fee, t2.id, t2.month, t2.fee
FROM
    table t1, table t2
WHERE t1.id = t2.id
  AND t1.month = '11'
  AND t2.month = '12'
  AND (t1.fee = 0 OR t2.fee = 0);

Но в этом запросе я вижу только идентификатор 1,3, но не идентификатор 4. Я думаю, это из-за t1.id = t2.id, но не знаю, как поступить иначе.

Ответы [ 3 ]

3 голосов
/ 20 июня 2019

Вы можете использовать условное агрегирование. В Postgres это может использовать синтаксис filter:

SELECT t.id,
       11 as month,
       MAX(t.fee) FILTER (WHERE t.month = 11) as fee_11, 
       12 as month,
       MAX(t.fee) FILTER (WHERE t.month = 12) as fee_12
FROM t
GROUP BY t.id
HAVING MAX(t.fee) FILTER (WHERE t.month = 11) = 0 OR
       MAX(t.fee) FILTER (WHERE t.month = 12) = 0;

Примечание. Двухмесячные столбцы являются избыточными.

2 голосов
/ 20 июня 2019

вам нужна условная агрегация

  select id,month,max(case when month=11 then fee end) fee11,
     max(case when month=12 then fee end) as fee12
    from (
    select * from table t1
    where t1.id in ( select id from table where fee=0)
    ) a group by id,month
1 голос
/ 20 июня 2019

Sql ANSI-совместимый запрос

    SELECT id, 
        MAX(CASE WHEN MONTH = 11 THEN MONTH ELSE NULL END) AS month11, 
        MAX(CASE WHEN MONTH = 11 THEN fee ELSE NULL END) AS fee11, 
        MAX(CASE WHEN MONTH = 12 THEN MONTH ELSE NULL END) AS month12, 
        MAX(CASE WHEN MONTH = 12 THEN fee ELSE NULL END ) AS fee12
    FROM t
    GROUP BY id
    HAVING ( MAX(CASE WHEN MONTH = 11 THEN fee ELSE NULL END) = 0 OR MAX(CASE WHEN MONTH = 12 THEN fee ELSE NULL END ) = 0 )
    ORDER BY id
...