Pivot в SQL: счетчик работает не так, как ожидалось

В моей базе данных Oracle Responsys есть таблица, которая содержит записи, среди которых есть две другие переменные:

  • статус

  • LOCATION_ID

Я хочу подсчитать количество записей, сгруппированных по status и location_id, и отобразить их в виде сводной таблицы.

Это, кажется, точный пример, который появляется здесь

Но когда я использую следующий запрос:

select * from 
    (select status,location_id from $a$ ) 
        pivot (count(status) 
        for location_id in (0,1,2,3,4)
    ) order by status

Значения, которые появляются в сводной таблице, являются просто именами столбцов:

выход:

status    0    1    2    3    4
-1        0    1    2    3    4
1         0    1    2    3    4
2         0    1    2    3    4
3         0    1    2    3    4
4         0    1    2    3    4
5         0    1    2    3    4

Я также дал попробовать следующее:

select * from 
     (select status,location_id , count(*) as nbreports 
       from $a$ group by status,location_id ) 
              pivot (sum(nbreports) 
              for location in (0,1,2,3,4)
    ) order by status

но это дает мне тот же результат.

 select status,location_id , count(*) as nbreports 
 from $a$ 
 group by status,location_id

конечно, даст мне значения, которые я хочу, но отображать их как столбец, а не как сводную таблицу

Как я могу получить в сводной таблице в каждой ячейке количество записей со статусом и расположением в строке и столбце?

Пример данных:

CUSTOMER,STATUS,LOCATION_ID
1,-1,1
2,1,1
3,2,1
4,3,0
5,4,2
6,5,3
7,3,4

Типы данных таблицы:

CUSTOMER    Text Field (to 25 chars)
STATUS  Text Field (to 25 chars)
LOCATION_ID Number Field

1 ответ

Решение

Пожалуйста, проверьте правильность моего понимания ваших требований, вы можете сделать наоборот для столбца местоположения.

    create table test(
    status varchar2(2),
    location number
    );

    insert into test values('A',1);
    insert into test values('A',2);
    insert into test values('A',1);
    insert into test values('B',1);
    insert into test values('B',2);

    select * from test;

    select status,location,count(*)
    from test 
    group by status,location;

    select * from (
    select status,location
    from test 
    ) pivot(count(*) for (status) in ('A' as STATUS_A,'B' as STATUS_B))

Другие вопросы по тегам