SQL Server 2012及更高版本中的复杂SELECT操作

时间:2015-12-17 05:25:06

标签: sql sql-server-2012

表架构:

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及更高版本。

感谢。

3 个答案:

答案 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
  )

这是SQL Fiddle

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

试试这段代码