【问题标题】:ORACLE SQL: How to group and count data by column?ORACLE SQL:如何按列对数据进行分组和计数?
【发布时间】:2021-04-09 14:24:21
【问题描述】:

我有两张桌子:

表 A:

ID CODE time-stamp
Aid_z code_z 2020-07-21
... ... ...
Aid_1 code_1 2020-11-30
Aid_2 code_2 2020-11-30
Aid_3 code_2 2020-11-30
Aid_4 code_1 2020-11-30
Aid_5 code_3 2020-11-30
... ... ...
Aid_n code_x 2021-04-06

ID 是唯一的,有 67 个不同的 CODE。

表 B:

ID ID_A status value time-stamp
Bid_z Aid_z z ... 2020-07-21
... ... ... ... ...
Bid_1 Aid_1 1 101.1 2020-11-30
Bid_2 Aid_2 0 87.6 2020-11-30
Bid_3 Aid_3 0 76.2 2020-11-30
Bid_4 Aid_4 1 106.2 2020-11-30
Bid_5 Aid_5 2 124.6 2020-11-30
... ... ... ... ...
Bid_n Aid_n x ... 2021-04-06

ID 是唯一的,ID_A 与表 A 中的 ID 相同。

我需要做的是:

  1. 计算每天有多少记录
  2. 每个不同代码的计数数量
  3. 将它们显示为一列,每一行应代表一天
  4. 仅适用于表 B 中的状态“0”或“1”
  5. 仅适用于 2020-11-30 和 2021-02-06 之间的记录

最终结果应该是这样的:

date (per day) sum_of_this_day code_1 code_2 code_2 ... code_z
2020-11-30 35 5 0 10 ... x
2020-11-31 60 6 5 12 ... x
... ... ... ... ... ... ...
2021-02-06 47 6 5 12 ... x

【问题讨论】:

  • 到目前为止你尝试了什么?
  • 考虑到日期范围和状态,我已经计算了 WHERE 子句。但是我有问题将所有内容放在一个查询中,从而得到我帖子中所述的结果 - 每天分别对应代表不同代码的每一列。有可能做出这样的吗?

标签: sql oracle


【解决方案1】:

我尝试了这个解决方案,如果有帮助,请告诉我。 我根据您的条件过滤了行 仅适用于表 B 中的状态“0”或“1” 仅适用于 2020-11-30 和 2021-02-06 之间的记录 然后我有一个表,其中包含满足您条件的代码,我使用“pivot”来计算每天的不同代码,在一个单独的表中,我计算了当天的总代码并将这两个表连接起来得到最终输出 distinct_day, total_codes, code1_count, code2_count,...codez_count

With filtered_table as (select A.time_stamp time_stamp , A.code code from A inner join B
                        on(A.id = B.id_a)
                        where B.status in (0, 1)
                        and A.time_stamp between to_date('2020-11-30','yyyy-mm-dd')  and to_date('2021-02-06','yyyy-mm-dd')),
     pivot_table as (select * from ( select time_stamp t1, code from filtered_table)
                    pivot ( count(code) for code  in ( 'code_1', 'code_2', 'code_3', 'code_z') )),
     every_day_cnt as ( SELECT time_stamp, count(code) cnt from filtered_table GROUP BY time_stamp)
SELECT A.*, B.cnt from pivot_table  A inner join every_day_cnt B on (A.t1 = b.time_stamp);

【讨论】:

  • 代码值之间的那些点不是有效的语法。
  • 是的,这意味着您必须将 code_1、code_2 放在假设的 code_z 之前,以便汇总表中存在的所有代码。
猜你喜欢
  • 2015-05-15
  • 2017-03-05
  • 1970-01-01
  • 2016-02-17
  • 2021-04-11
  • 2022-01-22
  • 1970-01-01
  • 1970-01-01
  • 2013-04-18
相关资源
最近更新 更多