2015-12-17 53 views
1

表模式:複雜的SELECT操作,後來

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

數據集:

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

我要選擇那些行有相同TransNo不同的項目。

預期輸出:

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

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

謝謝。

回答

2

您可以使用子查詢得到的TransNo列表中有多個不同的項目,然後只能通過從子查詢結果篩選初步名單:

SELECT TransNo, Serial, Project 
FROM TRANSACTIONDETAILS 
WHERE TransNo IN (
    SELECT TransNo 
    FROM TRANSACTIONDETAILS 
    GROUP BY TransNo 
    HAVING COUNT(DISTINCT Project) > 1 -- only select TransNo that have more than 
             -- one distinct project 
) 

這裏是SQL Fiddle

1

什麼,你會想要做的是獲得一個表與重複。
SELECT TransNo, Project FROM TRANSACTIONDETAILS GROUP BY TransNo, Project HAVING COUNT(1) > 1
然後你會想回到桌子上。下面是完整的查詢:
SELECT A.TransNo, A.Serial, A.Project FROM TRANSACTIONDETAILS A INNER JOIN ( SELECT TransNo, Project FROM TRANSACTIONDETAILS GROUP BY TransNo, Project HAVING COUNT(DISTINCT Project) > 1 ) B ON A.TransNo = B.TransNo

1
with cte 
    as 
    (
     select row_number() over (partition by TransNo,Project order by transno) as cnt,* 
     from TRANSACTIONDETAILS 
    ) 
select TransNo, 
    Serial, 
    Project 
from cte 
where cnt=1 

試試這個代碼