我具有以下数据的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
答案 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关键字用作列名。我将它们更改为DATE
和COUNT
。
在创建另外一列DT
以显示每一行所属的组之后,这对于CT
来说是一项简单的工作。我在“ 2018年7月30日之前”将标志创建为GROUP BY ROLLUP
-否则标志为NULL。 (这也使我也可以使用FLAG
中的标志,因为默认情况下'b'
的排序是ORDER BY
。)
在运行查询之前,请记住要完整地删除子句FLAG
,并使用实际的表名和列名。
NULLS LAST