Esty
Esty

Reputation: 1912

Complex SQL Select Query

Table schema:

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

Dataset:

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

I want to identify transactions those have same project sets.

Expected output:

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

I am using SQL Server 2012 and later.

Thanks.

UPDATE 1: Partially my objective would be achieved if I make following from input dataset.

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

UPDATE 2:

Data set

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

Output:

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

Upvotes: 2

Views: 82

Answers (2)

Smart003
Smart003

Reputation: 1119

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

Upvotes: 0

Pரதீப்
Pரதீப்

Reputation: 93754

Try this

;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 

Update : For partial result

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 

Upvotes: 3

Related Questions