我有一张基本上包含两个字段的表格; transactionnumber和productnumber。交易可以包含多个产品。目前该表格如下:
--------- | T1 | P1 | | T1 | P2 | | T2 | P2 | | T2 | P3 | | T2 | P4 | | T3 | P1 | | T3 | P4 | | T4 | P1 | | T4 | P3 | | T4 | P5 | ---------
相反,我希望能够计算出产品的销售方式,因此每个交易需要两种产品组合。 (对不起,如果我不清楚)这就是我想要的方式:
------------ | T1 | P1, P2 | | T2 | P2, P3 | | T2 | P2, P4 | | T2 | P3, P4 | | T3 | P1, P4 | | T4 | P1, P3 | | T4 | P1, P5 | | T4 | P3, P5 | ------------
如何做到这一点?谢谢!
答案 0 :(得分:1)
您可以通过在事务ID上将表连接到自身来获取给定事务的所有产品组合。
Column1 Column2 idx
--------------------
1 1 0
2 1 1
3 2 0
4 3 0
5 3 1
1 3 2
答案 1 :(得分:1)
尝试以下查询
WITH TAB AS (
SELECT A.* , ROW_NUMBER() OVER (PARTITION BY TRANSACTION_NUM ORDER BY PRODUCT_NUM) RN FROM TEST_INT A)
SELECT X.TRANSACTION_NUM, X.PRODUCT_NUM||','||Y.PRODUCT_NUM FROM TAB X, TAB Y
WHERE X.RN+1 = Y.RN
AND X.TRANSACTION_NUM = Y.TRANSACTION_NUM
ORDER BY X.TRANSACTION_NUM
脚本供您参考
CREATE TABLE TEST_INT
(
TRANSACTION_NUM VARCHAR(50),
PRODUCT_NUM VARCHAR(50));
INSERT INTO TEST_INT VALUES ('T1','P1');
INSERT INTO TEST_INT values ('T1','P2');
INSERT INTO TEST_INT VALUES ('T2','P2');
INSERT INTO TEST_INT values ('T2','P3');
INSERT INTO TEST_INT VALUES ('T2','P4');
INSERT INTO TEST_INT VALUES ('T3','P1');
INSERT INTO TEST_INT VALUES ('T3','P4');
COMMIT;
说明:在上面的查询中,我们只是填充transaction_num上的行号分组,然后我们使用自联接将当前行与下一行连接起来。希望你理解逻辑。
注意:我在Oracle中尝试过这个。