Общая сводная таблица SQL на столбец - PullRequest
0 голосов
/ 27 февраля 2019

Итак, у меня есть таблица с динамическими заголовками.

enter image description here

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

select listagg(INSERT_DATE,
''',''') WITHIN GROUP(ORDER BY INSERT_DATE)
from (select distinct INSERT_DATE from TEST_TBL order by INSERT_DATE asc)

Результат из вышеприведенного запроса используется для предложения in для ниже.

select * from (select log, lot, insert_date from TEST_TBL)
pivot(count(distinct log || insert_date)
for(insert_date) in ('17-JAN-19', '21-JAN-19', '22-JAN-19'))

Теперь я хочу получить этот результат, в котором будет отображаться сумма по столбцам.в конце всех рядов.Я пытался использовать GROUP BY ROLLUP, но он не работает.

enter image description here

Я пробовал этот запрос:

    select * 
    from (select * from (select log, lot, insert_date from TEST_TBL) pivot(count(distinct log || insert_date)
    for(insert_date) in ('17-JAN-19', '21-JAN-19', '22-JAN-19')))
    group by rollup (log); 

Может кто-топомогите мне по какому запросу использовать?Спасибо.

Редактировать: я использовал решение @ q4za4 и пришел к этому последнему запросу

from   (select *
            from   (select log,
                           lot,
                           insert_date
                    from   TEST_TBL)
            pivot(
                    count(distinct lot || insert_date)
                    for   (insert_date) 
                    in    ('17-JAN-19','21-JAN-19','22-JAN-19'))
    )
    UNION ALL
    select 'TOTAL # OF LOGS',
           sum(jan1719),sum(jan2119),sum(jan2219)
    FROM   (select *
            from   (select log,
                           lot,
                           insert_date
                    from   TEST_TBL)
            pivot(
                    count(distinct lot || insert_date)
                    for   (insert_date) 
                    in    (
                    '17-JAN-19' as jan1719,'21-JAN-19' as jan2119,'22-JAN-19' as jan2219
                    )))

Спасибо также решению @Ponder Stibbons, которое также помогло мне, давмне идея сделать дополнительную часть в моем listagg-запросе, чтобы создать первую строку целевого запроса.

Ответы [ 2 ]

0 голосов
/ 27 февраля 2019

Этот запрос работает:

select lot, sum(d17) sd17, sum(d22) sd22, sum(d23) sd23
  from test_tbl
  pivot(count(distinct log) for(insert_date) in (date '2019-01-17' d17, 
                                                 date '2019-01-22' d22, 
                                                 date '2019-01-23' d23))
  group by rollup(lot)

Демоверсия dbfiddle

Итак, если вы генерируете даты динамически, выВам также нужно будет сделать дополнительную часть в вашем listagg-запросе, чтобы создать первую строку целевого запроса, как вы делали для предложения in.Вы можете создать псевдоним столбцов, как хотите, затем попытаться построить динамический запрос и проверить правильность синтаксиса, используя dbms_output.

0 голосов
/ 27 февраля 2019

Самый быстрый подход - дублировать один и тот же запрос.Примерно так:

select *
from   (select log,
               lot,
               insert_date
        from   TEST_TBL)
pivot(
        count(distinct log || insert_date)
        for   (insert_date) 
        in    ('17-JAN-19', '21-JAN-19', '22-JAN-19'))
)
UNION ALL
select NULL,
       sum(),
       sum(),
       sum(),
FROM   (
        select *
        from   (select log,
                       lot,
                       insert_date
                from   TEST_TBL)
        pivot(
                count(distinct log || insert_date)
                for   (insert_date) 
                in    ('17-JAN-19', '21-JAN-19', '22-JAN-19'))
       )

в скобках в сумме () добавить имена столбцов cyour

...