Oracle SQL查询以特定格式获取输出

时间:2018-09-29 11:16:40

标签: sql database oracle

我具有以下数据的oracle数据库表“ mytable”-

Sr_NO    Name   Status  Date
121      HP     OK     12/06/2018
122      Dell   OK     15/06/2018
123      MAC    NOK    30/07/2018
124      Apple  NOK    03/09/2018
125      MI     NOK    04/09/2018
126      Oppo   NOK    05/09/2018
127      Vivo   OK     06/09/2018

我想以以下格式获取输出-

Category        Count   OK  NOK
Till 30th Jul   3       2   1
After 30th Jul  4       1   3
Total           7       3   4

2 个答案:

答案 0 :(得分:1)

您可以使用条件聚合来获取列,并使用grouping sets来获取其他行:

select (case when date <= '2018-07-30' then 'Till 30th Jul'
             else 'After 30th Jul'
        end) as category,
       count(*),
       sum(case when status = 'OK' then 1 else 0 end) as OK,
       sum(case when status = 'NOK' then 1 else 0 end) as NOK
from t
group by grouping sets ( ( (case when date <= '2018-07-30' then 'Till 30th Jul'
                                 else 'After 30th Jul'
                             end)
                         ),
                         ()
                        );

您可以将total添加为类别(在您的情况下),方法是与NULL进行比较:

select (case when date is null then 'Total'
             when date <= '2018-07-30' then 'Till 30th Jul'
             else 'After 30th Jul'
        end) as category,

您的数据中没有NULL个日期,因此很好。否则,您应该使用GROUPING()

答案 1 :(得分:0)

请勿将'Deprecated since version 3.6: Please use asyncio instead.'asyncio之类的Oracle关键字用作列名。我将它们更改为DATECOUNT

在创建另外一列DT以显示每一行所属的组之后,这对于CT来说是一项简单的工作。我在“ 2018年7月30日之前”将标志创建为GROUP BY ROLLUP-否则标志为NULL。 (这也使我也可以使用FLAG中的标志,因为默认情况下'b'的排序是ORDER BY。)

在运行查询之前,请记住要完整地删除子句FLAG,并使用实际的表名和列名。

NULLS LAST