2015-12-29 289 views
2

表模式:复杂的SQL SELECT查询

CREATE TABLE TRANSACTIONDETAILS 
(
    TransNo CHAR(15), 
    Serial INT, 
    Project CHAR(3) 
) 

数据集:

+-----------------+--------+---------+ 
|  TransNo  | Serial | Project | 
+-----------------+--------+---------+ 
| A00000000000001 |  1 |  100 | 
| A00000000000001 |  2 |  101 | 
| A00000000000002 |  1 |  100 | 
| A00000000000002 |  2 |  101 | 
| A00000000000003 |  1 |  100 | 
| A00000000000003 |  2 |  200 | 
| A00000000000004 |  1 |  200 | 
| A00000000000004 |  2 |  100 | 
| A00000000000005 |  1 |  101 | 
| A00000000000005 |  2 |  100 | 
+-----------------+--------+---------+ 

我想,以确定这些交易有同一个项目组。

预期输出:

+-----------------+--------+---------+---------+ 
|  TransNo  | Serial | Project | Flag | 
+-----------------+--------+---------+---------+ 
| A00000000000001 |  1 |  100 |  1 | 
| A00000000000001 |  2 |  101 |  1 | 
| A00000000000002 |  1 |  100 |  1 | 
| A00000000000002 |  2 |  101 |  1 | 
| A00000000000005 |  1 |  101 |  1 | 
| A00000000000005 |  2 |  100 |  1 | 
| A00000000000003 |  1 |  100 |  2 | 
| A00000000000003 |  2 |  200 |  2 | 
| A00000000000004 |  1 |  200 |  2 | 
| A00000000000004 |  2 |  100 |  2 | 
+-----------------+--------+---------+---------+ 

我使用SQL Server 2012及更高版本。

谢谢。

UPDATE 1:如果我从输入数据集中获得以下内容,我的部分目标就会实现。

+-----------------+---------+---------+ 
|  TransNo  | Project1| Project2| 
+-----------------+---------+---------+ 
| A00000000000001 |  100 |  101 | 
| A00000000000002 |  100 |  101 | 
| A00000000000003 |  100 |  200 | 
| A00000000000004 |  200 |  100 | 
| A00000000000005 |  101 |  100 | 
+-----------------+---------+---------+ 

更新2:

数据集

+-----------------+--------+---------+ 
|  TransNo  | Serial | Project | 
+-----------------+--------+---------+ 
| A00000000000001 |  1 |  100 | 
| A00000000000001 |  2 |  101 | 
| A00000000000001 |  3 |  200 | 
| A00000000000002 |  1 |  100 | 
| A00000000000002 |  2 |  101 | 
| A00000000000003 |  1 |  100 | 
| A00000000000003 |  2 |  200 | 
| A00000000000004 |  1 |  200 | 
| A00000000000004 |  2 |  100 | 
| A00000000000005 |  1 |  101 | 
| A00000000000005 |  2 |  100 | 
+-----------------+--------+---------+ 

输出:

+-----------------+--------+---------+---------+ 
|  TransNo  | Serial | Project | Flag | 
+-----------------+--------+---------+---------+ 
| A00000000000001 |  1 |  100 |  1 | 
| A00000000000001 |  2 |  101 |  1 | 
| A00000000000001 |  2 |  200 |  1 | 
| A00000000000002 |  1 |  100 |  2 | 
| A00000000000002 |  2 |  101 |  2 | 
| A00000000000005 |  1 |  101 |  2 | 
| A00000000000005 |  2 |  100 |  2 | 
| A00000000000003 |  1 |  100 |  3 | 
| A00000000000003 |  2 |  200 |  3 | 
| A00000000000004 |  1 |  200 |  3 | 
| A00000000000004 |  2 |  100 |  3 | 
+-----------------+--------+---------+---------+ 
+1

什么是'Flag'列逻辑? – Fabio

+0

标志只是识别具有相同项目集的事务。那些在项目100和101之间承诺的事务被标记为1,那些100和200被标记为2.它可以是任何int,char只是一个标识节点。 – Esty

回答

3

尝试此

;WITH cte 
    AS (SELECT *, 
       Concat(Min(Project)OVER(partition BY TransNo), Max(Project)OVER(partition BY TransNo)) AS inter 
     FROM TRANSACTIONDETAILS) 
SELECT TransNo, 
     Serial, 
     Project, 
     Dense_rank()OVER(ORDER BY inter) AS flag 
FROM cte 

更新:对于部分结果

SELECT TransNo, 
     Max(CASE WHEN Serial = 1 THEN Project END) AS Project_1, 
     Max(CASE WHEN Serial = 2 THEN Project END) AS Project_2 
FROM TRANSACTIONDETAILS 
GROUP BY TransNo 
+0

你只是摇滚... – Esty

+0

请你看看更新2.如果在交易中存在3个项目会怎样。通过获取交易A00000000000001的最小和最大限制,其100200作为交易。有什么办法可以让它变成100101200? – Esty

+0

@TanjimRahman - 可以请问这是一个新的问题 –

0
CREATE TABLE #test_trans 
    ([TransNo] varchar(15), [Serial] int, [Project] int) 
; 

INSERT INTO #test_trans 
    ([TransNo], [Serial], [Project]) 
VALUES 
    ('A00000000000001', 1, 100), 
    ('A00000000000001', 2, 101), 
    ('A00000000000001', 3, 200), 
    ('A00000000000002', 1, 100), 
    ('A00000000000002', 2, 101), 
    ('A00000000000003', 1, 100), 
    ('A00000000000003', 2, 200), 
    ('A00000000000004', 1, 200), 
    ('A00000000000004', 2, 100), 
    ('A00000000000005', 1, 101), 
    ('A00000000000005', 2, 100) 
; 

[![;WITH cte 
    AS (select \[TransNo\],(
Select cast(ST1.\[Project\] as varchar(max)) AS \[text()\] 
       From #test_trans ST1 
       where st1.TransNo=st2.TransNo 
       For XML PATH ('')) as rn,Project,st2.Serial from #test_trans st2) 
SELECT TransNo, 
     Serial, 
     Project, 
     Dense_rank()OVER(ORDER BY rn) AS flag 
FROM cte][1]][1] 

enter image description here