表架构:
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及更高版本。
感谢。
答案 0 :(得分: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
)
答案 1 :(得分: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
答案 2 :(得分: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
试试这段代码