【问题标题】:Selecting data from DB where there are multiple records and fieldvalue is the same in both all records从有多个记录且字段值在所有记录中都相同的数据库中选择数据
【发布时间】:2017-01-04 18:09:16
【问题描述】:

我在 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 并且真的不知道如何做到这一点。

【问题讨论】:

  • clientno 的表中是否可以有 2 个以上的条目?如果是这样,即使一组满足您的条件,您是否应该返回该客户端的所有行?还是你必须退回那一套?
  • @vkp 是的 - 他们拥有的数量没有限制。通常它是一个特定日期的 2 条记录......所以客户有 ApptDate,然后调用并取消该 ApptDate。我只想查看 2 条记录。因为在典型情况下,客户将获得一个新的 ApptDate 用于重新安排的约会。因此,查看日期不相同的单个客户的记录会破坏目的。我基本上想看看计划/取消的应用程序。

标签: sql sql-server-2012


【解决方案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

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

HAVING 子句的第二个谓词:

COUNT(DISTINCT ApptDate) = 1

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

编辑:

要获取具有相同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

【讨论】:

  • 这还将显示该客户的任何其他记录,这些记录可能不在同一天。诚然,OP 并不清楚他想要什么,但我最好的理解是,他只想看到同一天的那些......
  • @JohnChrysostom 我认为这就是我的查询所提供的。请看我制作的cmets。
  • @JohnChrysostom - 我怎么不清楚?我指定我需要查看更多 >1 RecordNo 和 ApptDate 相同的客户记录。我展示了数据样本和我想要的最终结果
  • 假设客户端 7 也有 10/15/2016 的记录。您希望在输出中看到该记录吗? Giorgios 的回答会显示出来。
  • @JohnChrysostom ,你是对的。仅显示 recordno>1 和 apptDate 相同的数据。如果客户有 3 个日期,其中 2 个是相同的,而第三个不是 - 我只需要查看 ApptDate 相同的 2 个条目
【解决方案2】:

我相信这就是您要找的...窗口功能 (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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多