SQL:重新排列表以获得唯一组合

时间:2017-02-20 10:02:48

标签: mysql sql

我有一张基本上包含两个字段的表格; 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 |
 ------------

如何做到这一点?谢谢!

2 个答案:

答案 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;

myoutput

说明:在上面的查询中,我们只是填充transaction_num上的行号分组,然后我们使用自联接将当前行与下一行连接起来。希望你理解逻辑。

注意:我在Oracle中尝试过这个。