我有以下表格:
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
我如何获得每个代码的每个日期,使结果集具有上述两个不同结果集的乘积大小?
您可以使用PARTITION
edOUTER 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);
对于您的样本数据,输出:
<表类>tbody><<tr> 代码 DATE_COL VAL 1 20210101 1 11 20210102 1 2 20210103 1 2 20210101 1 2 20210102 1 表类> 20210103 1 一个简单的选择是执行三重自交叉连接:
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