2017-02-20 52 views
0

我有一个基本上包含两个字段的表;交易号码和产品号码。交易可以包含多个产品。目前,该表中给出如下:SQL:重新排列表以获得唯一组合

 
--------- 
| 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

您使用的是MySQL还是MS SQL Server? (请勿标记不涉及的产品。) – jarlh

+1

向您的样品数据添加一行(T5,P2),并调整结果。 – jarlh

+0

我只查看与几种产品的交易,因此没有必要 – Carls

回答

1

通过将表加入到事务ID本身,您可以获得给定事务的所有产品组合。

select t1.t, t1.p, t2.p, count(*) 
from mytable t1 
join mytable t2 on t1.t = t2.t and t1.p < t2.p 
group by t1.t, t1.p, t2.p 
+0

感谢您的快速响应!我正在检查结果,看看它是否有效 – Carls

+1

它看起来像它的作品,谢谢! – Carls

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,然后我们使用自连接来加入curr ent行与下一行。希望你理解这个逻辑。

注:我已经在Oracle中尝试了这一点。

+0

谢谢,它似乎工作! – Carls