Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在oracle sql中聚合多个列_Oracle_Oracle11g_Pivot - Fatal编程技术网

在oracle sql中聚合多个列

在oracle sql中聚合多个列,oracle,oracle11g,pivot,Oracle,Oracle11g,Pivot,这个问题的措辞有困难。如果有更好的标题,请告诉我 我有一个生成如下数据的查询: +----------+----------+----------+----------+----------+ | KEY | FEB_GRP1 | JAN_GRP1 | FEB_GRP2 | JAN_GRP2 | +----------+----------+----------+----------+----------+ | 50840992 | 1 | 1 |

这个问题的措辞有困难。如果有更好的标题,请告诉我

我有一个生成如下数据的查询:

+----------+----------+----------+----------+----------+
|   KEY    | FEB_GRP1 | JAN_GRP1 | FEB_GRP2 | JAN_GRP2 |
+----------+----------+----------+----------+----------+
| 50840992 |        1 |        1 |        0 |        0 |
| 50840921 |        0 |        1 |        1 |        0 |
| 50848995 |        0 |        0 |        0 |        0 |
+----------+----------+----------+----------+----------+
+----------+------+------+
|   KEY    | JAN  | FEB  |
+----------+------+------+
| 50840992 | <50  | ~<50 |
| 50840921 | <50  | <50  |
| 50848995 | ~<50 | ~<50 |
| 50840885 | <50  | <50  |
+----------+------+------+
+-------+------+------+
| MONTH | GRP1 | GRP2 |
+-------+------+------+
| JAN   |    2 |    0 |
| FEB   |    1 |    1 |
+-------+------+------+
或者,我可以生成如下数据:

+----------+----------+----------+----------+----------+
|   KEY    | FEB_GRP1 | JAN_GRP1 | FEB_GRP2 | JAN_GRP2 |
+----------+----------+----------+----------+----------+
| 50840992 |        1 |        1 |        0 |        0 |
| 50840921 |        0 |        1 |        1 |        0 |
| 50848995 |        0 |        0 |        0 |        0 |
+----------+----------+----------+----------+----------+
+----------+------+------+
|   KEY    | JAN  | FEB  |
+----------+------+------+
| 50840992 | <50  | ~<50 |
| 50840921 | <50  | <50  |
| 50848995 | ~<50 | ~<50 |
| 50840885 | <50  | <50  |
+----------+------+------+
+-------+------+------+
| MONTH | GRP1 | GRP2 |
+-------+------+------+
| JAN   |    2 |    0 |
| FEB   |    1 |    1 |
+-------+------+------+
我已经可以通过对JAN_GRP1求和得到JAN_GRP1,但我希望它只是一个数据点,而不是一列本身

我的查询生成第一个图表:

SELECT *

FROM (
SELECT KEY, 
CASE WHEN "FEB-1-2016" = '<50' THEN 1 ELSE 0 END AS FEB_GRP1,
CASE WHEN "FEB-1-2016" != '<50' THEN 1 ELSE 0 END AS FEB_GRP2,
CASE WHEN "JAN-1-2016" = '<50' THEN 1 ELSE 0 END AS JAN_GRP1,
CASE WHEN "JAN-1-2016" != '<50' THEN 1 ELSE 0 END AS JAN_GRP2

FROM MY_TABLE);

您的数据模型没有多大意义,但从您所展示的内容来看,您可以做到:

select 'JAN' as month,
  count(case when "JAN-1-2016" = '<50' then 1 end) as grp1,
  count(case when "JAN-1-2016" != '<50' then 1 end) as grp2
from my_table
union all
select 'FEB' as month,
  count(case when "FEB-1-2016" = '<50' then 1 end) as grp1,
  count(case when "FEB-1-2016" != '<50' then 1 end) as grp2
from my_table;
然后汇总:

select to_char(month, 'MON', 'NLS_DATE_LANGUAGE=ENGLISH') as month,
  count(case when value = '<50' then 1 end) as grp1,
  count(case when value != '<50' then 1 end) as grp2
from (
  select *
  from my_table
  unpivot(value for month in ("JAN-1-2016" as date '2016-01-01',
    "FEB-1-2016" as date '2016-02-01') --, etc. for other months
  )
)
group by month;

仍然不太漂亮,我认为Oracle在幕后也做着同样的事情,但是要创建和维护的case表达式更少了——drudge部分是unpivot对。根据您拥有的数据范围,您可能需要在“月”字段中包含年份。

请显示您的查询。这没有任何意义2016年2月1日='我假设这些是表中引用的标识符,值是字符串。显示表格结构和产生这些结果的数据会很有帮助。我可以复制它,但这是一张奇怪的桌子。它实际上是从其他地方生成的数据吗?听起来可能是X-Y问题,也许……对不起,澄清一下:2016年2月1日等等都是专栏。太棒了。如果我也想根据年份取消PIVOT,我会怎么做?我的数据实际上跨越了一年多的时间,我正在简化这个例子问题。unpivot保留了这一年,分组也尊重这一点;您只需要在to_char格式掩码中包含年份,真的吗?我不明白这是什么意思。@DanielPaczuskiBak-unpivot子句使用月份和年份,如日期“2016-01-01”值。这意味着它分组的月份值是同一日期,包括年份。如果您的数据跨越一年,您将看到“一月”或几个月的两行数据。因此,我认为您需要做的就是将第一行更改为选择“MON-yyy”。。。或者您希望以何种方式同时显示年份和月份。