从DB中选择有多个记录和fieldvalue的数据在所有记录中都是相同的

时间:2017-01-04 18:09:16

标签: sql sql-server-2012

我在SQL Server中有一个表,我很难查询我需要的数据。

这就是它的样子......

ClientNo          RecordNo           ApptDate
-----------------------------------------------
7                 1                  10/31/2016
7                 2                  10/31/2016
7                 3                  10/15/2016
9                 1                  11/12/2016
9                 2                  11/11/2016
18                1                  9/19/2016

所以看一下这个表 - 每个客户端可以有1个或多个记录。我试图找到所有拥有1个以上记录的客户端,并且对于拥有1个以上记录的所有客户端 - 我需要确保只显示那两个条目具有相同ApptDate的客户端。

我的最终目标是看到这个...

ClientNo         RecordNo        ApptDate
-------------------------------------------
7                 1              10/31/2016
7                 2              10/31/2016

因此,客户端7有3条记录(1,2,3),而ApptDate则是3条记录中的2条。我只想查看ApptDate相同的记录,并跳过ApptDate = 10/15/2016的记录,因为它不相关!

我从来没有做过这样的事情,我指的是ApptDate = ApptDate并且真的不知道如何做到这一点。

2 个答案:

答案 0 :(得分:1)

试试这个:

SELECT *
FROM mytable
wHERE ClientNo IN (SELECT ClientNo
                   FROM mytable
                   GROUP BY ClientNo
                   HAVING COUNT(DISTINCT RecordNo) > 1 AND
                          COUNT(DISTINCT ApptDate) = 1

HAVING子句的第一个谓词:

COUNT(DISTINCT RecordNo) > 1

过滤掉只有一个相关ClientNo值的RecordNo值。

HAVING子句的第二个谓词:

COUNT(DISTINCT ApptDate) = 1

过滤掉与ClientNo个值相关的ApptDate值。

修改

要获得具有相同ClientNo,不同RecordNo和相同ApptDate的记录,您可以使用简单的JOIN

SELECT t1.*
FROM mytable AS t1
JOIN mytable AS t2 
   ON t1.ClientNo = t2.ClientNo AND
      t1.ApptDate = t2.ApptDate AND
      t1.RecordNo <> t2.RecordNo

答案 1 :(得分:1)

我相信这就是你要找的......窗口函数(https://msdn.microsoft.com/en-us/library/ms189461.aspx)会让你找到具有相同日期的客户。

select
    clientno,
    recordno,
    apptdate
from
    (
        select
            clientno,
            recordno,
            apptdate,
            count(*) over(partition by clientno, apptdate) as numrecs
        from
            table
    )
where
    numrecs > 1