Проблема агрегации Netezza (пивот) - PullRequest
2 голосов
/ 22 октября 2011

Я использую Netezza для создания отчета, и у меня есть следующий запрос

select  b.group_name,a.group_id, PASS_FAIL, COUNT(*) from log a
join group b on a.group_id=b.group_id
group by b.group_name,a.group_id, PASS_FAIL

Он собирает информацию о количестве проходов и неудач в таблице, подобной этой:

    GROUP_NAME  GROUP_ID    PASS_FAIL   COUNT
    GROUP1        4            FAIL     382
    GROUP1        4            PASS     339

Как я могу изменить запрос, чтобы я мог использовать PASS и FAIL в качестве столбцов.

GROUP_NAME  GROUP_ID      PASS      FAIL
GROUP1        4           339       382

Pivot не доступен в Netezza, поэтому мне было интересно, как лучше всего это сделать. Каков наилучший способ сделать это?

Ответы [ 2 ]

3 голосов
/ 22 октября 2011

У меня нет прямого опыта работы с netezza, но из того, что я читал, он поддерживает стандартное SQL-решение SUM / CASE

SELECT 
    GROUP_NAME,
    GROUP_ID,
    SUM(CASE WHEN PASS_FAIL = 'PASS' THEN 1 ELSE 0 END) as PASS,
    SUM(CASE WHEN PASS_FAIL = 'FAIL' THEN 1 ELSE 0 END) as FAIL
FROM 
    log a
    join group b 
    on a.group_id=b.group_id
GROUP BY 
    b.group_name,
    a.group_id
2 голосов
/ 22 октября 2011

Просто выполните самостоятельное объединение модифицированных версий вашего запроса выше, каждый из которых создает один из столбцов pass и fail, который вам нужен (обратите внимание, что я не проверял это, поскольку у меня нетустановка Netezza для работы):

select group_name,group_id,pass,fail
from(
    select group_name,group_id,pass
    from(
        select  b.group_name,a.group_id, COUNT(*) as pass
        from log a
        join group b on a.group_id=b.group_id
        where pass_fail='PASS'
        group by b.group_name,a.group_id
        )x
    )p
join(
    select group_name,group_id,fail
    from(
        select  b.group_name,a.group_id, COUNT(*) as fail
        from log a
        join group b on a.group_id=b.group_id
        where pass_fail='FAIL'
        group by b.group_name,a.group_id
        )y
    )f
on(p.group_name=f.group_name and p.group_id=f.group_id);
...