每列的SQL数据透视表总数

时间:2019-02-27 09:32:15

标签: sql oracle pivot rollup dynamic-columns

所以我有这个带有动​​态标题的表。

enter image description here

下面的查询用于生成将用于表查询的日期。

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-query中添加其他部分以创建目标查询的第一行的想法,这也为我提供了帮助。

2 个答案:

答案 0 :(得分:0)

最快的方法是重复相同的查询。像这样:

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'))
       )

sum()中的括号之间添加cyour列名称

答案 1 :(得分:0)

此查询有效:

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 demo

因此,如果您动态生成日期,则还必须像在in子句中一样,在listagg查询中添加其他部分来创建目标查询的第一行。您可以根据需要为列添加别名,然后尝试使用dbms_output构建动态查询并检查语法是否正确。