Oracle SELECT每个不同的列对每个不同的列

  • 本文关键字:SELECT Oracle sql oracle
  • 更新时间 :
  • 英文 :


我有以下表格:

CREATE TABLE TEMP_TEST 
(
CODE NUMBER,
DATE_COL NUMBER,
VAL NUMBER
);

与价值观:

INSERT INTO TEMP_TEST (code, DATE_COL, val) 
VALUES (1, 20210101, 1);
INSERT INTO TEMP_TEST (code, DATE_COL, val) 
VALUES (1, 20210102, 1);
INSERT INTO TEMP_TEST (code, DATE_COL, val) 
VALUES (1, 20210103, 1);
INSERT INTO TEMP_TEST (code, DATE_COL, val) 
VALUES (2, 20210101, 1);

作为结果,我想得到每个不同的DATE_COL行除以每个不同的CODE行:

CODE|DATE_COL|VAL|
----+--------+---+
1|20210101|  1|
1|20210102|  1|
1|20210103|  1|
2|20210101|  1|
2|20210102|  1| (new line)
2|20210103|  1| (new line)

这是每个日期的区别:

SELECT DATE_COL 
FROM TEMP_TEST 
GROUP BY DATE_COL

这是每个代码的区别:

SELECT code 
FROM TEMP_TEST 
GROUP BY CODE

我如何获得每个代码的每个日期,使结果集具有上述两个不同结果集的乘积大小?

您可以使用PARTITIONedOUTER JOIN:

SELECT t.code,
d.date_col,
COALESCE(t.val, 1) AS val
FROM   (
SELECT DISTINCT date_col FROM temp_test
) d
LEFT OUTER JOIN temp_test t
PARTITION BY (t.code)
ON (t.date_col = d.date_col);

对于您的样本数据,输出:

<表类>代码DATE_COLVALtbody><<tr>120210101112021010211202101031220210101122021010212202101031

一个简单的选择是执行三重自交叉连接:

SQL> select distinct a.code, b.date_col, c.val
2  from temp_test a cross join temp_test b cross join temp_test c
3  order by 1, 2, 3;
CODE   DATE_COL        VAL
---------- ---------- ----------
1   20210101          1
1   20210102          1
1   20210103          1
2   20210101          1
2   20210102          1
2   20210103          1
6 rows selected.
SQL>

对于巨大的表,它将如何表现,这是另一个问题。如果它们不是那么,我想应该没问题。

可以在DATE_COL和CODE的不同值之间执行笛卡尔连接。不清楚您想从VAL列中显示什么,所以我不显示它

select date_col_data.DATE_COL, code_data.code
from
(SELECT distinct DATE_COL 
FROM TEMP_TEST ) date_col_data,
( SELECT distinct code 
FROM TEMP_TEST ) code_data

db fiddle here https://dbfiddle.uk/?rdbms=oracle_18&fiddle=a9cf8afb7b5e1d652ddb5362066f0970

相关内容

  • 没有找到相关文章

最新更新