выбор агрегатных функций - PullRequest
0 голосов
/ 27 февраля 2020

Существует таблица tbl_Regist:

| ID | CODE   | VAL       |
+----+--------+-----------+
| 95 | numVz  | 06        |
| 95 | prevVz | 84605898  |
| 95 | ndatVz | 10.10.10  |
| 95 | numVz  | 06        |
| 95 | prevVz | 14666641  |
| 95 | ndatVz | 11.11.11  |
| 95 | numVz  | 06        |
| 95 | prevVz | 84605898  |
| 95 | ndatVz | 12.12.12  |  

Мне нужно получить данные в этом представлении:

| ID | numVz | prevVz   | ndatVz   | 
+----|-------+----------+----------+
| 95 | 06    | 84605898 | 10.10.10 |   
| 95 | 06    | 14666641 | 11.11.11 |
| 95 | 06    | 84605898 | 12.12.12 |    

Мой запрос:

select 
      t.ID,
      max(case when t.code = 'numVz'  then t.val end) as numVz
     ,max(case when t.code = 'prevVz' then t.val end) as prevVz
     ,max(case when t.code = 'ndatVz' then t.val end) as ndatVz
from tbl_Regist t
where t.ID = 95
group by t.ID     


| ID | numVz | prevVz   | ndatVz   | 
+----|-------+----------+----------+
| 95 | 06    | 84605898 | 12.12.12 |

Возвраты только одна строка, если вы удалите агрегатную функцию, она возвращает 9 строк

1 Ответ

2 голосов
/ 27 февраля 2020

Вы можете использовать row_number() для добавления перечисления. Однако вам действительно нужен столбец заказа:

select r.ID,
       max(case when r.code = 'numVz'  then r.val end) as numVz,
       max(case when r.code = 'prevVz' then r.val end) as prevVz,
       max(case when r.code = 'ndatVz' then r.val end) as ndatVz
from (select r.*,
             row_number() over (partition by id, code order by <ordering column>) as seqnum
      from tbl_Regist r
     ) r
where r.ID = 95
group by r.ID, seqnum;
...