SQL Server:返回具有多个不同值的行

时间:2018-04-23 02:21:04

标签: sql-server distinct

在过去的一天半里,我一直在研究这个问题,而且似乎无法在这里找到适用于我的代码的另一个问题。

我在这里有一张桌子:

Table_D

Policynumber|   EntryDate   |  BI_Limit   | P remium
------------------------------------------------------
ABCD100001  |   5/1/16      |   15/30     | 919
ABCD100001  |   5/13/16     |   15/30     | 1008 
ABCD100002  |   5/24/16     |   100/300   | 1380
ABCD100003  |   5/30/16     |   25/50     | 1452
ABCD100003  |   6/2/16      |   25/50     | 1372
ABCD100003  |   6/4/16      |   30/60     | 951
ABCD100004  |   6/11/16     |   100/300   | 1038
ABCD100005  |   6/22/16     |   100/300   | 1333
ABCD100005  |   7/2/16      |   50/100    | 1208
ABCD100006  |   7/10/16     |   250/500   | 1345
ABCD100007  |   7/18/16     |   15/30     | 996

我试图提取policynumber中有多个列表不同的BI_Limit的行。所以输出应该是:

输出

Policynumber    | EntryDate  |  BI_Limit  | Premium
---------------------------------------------------
ABCD100003      | 5/30/16    |  25/50     | 1452
ABCD100003      | 6/2/16     |  25/50     | 1372
ABCD100003      | 6/4/16     |  30/60     | 951
ABCD100005      | 6/22/16    |  100/300   | 1333
ABCD100005      | 7/2/16     |  50/100    | 1208

我将Policynumber存储为VARCHAR(Max),EntryDate存储为DATE,BI_Limit存储为VARCHAR(Max),Premium存储为INTEGER。

我想说的代码应该是有用的:

    SELECT * FROM Table_D
    WHERE BI_Limit IN (
        SELECT BI_Limit
        FROM Table_D
        GROUP BY BI_Limit
        HAVING COUNT(DISTINCT BI_Limit)>1);

但这对我没有任何回报。任何人都可以帮我告诉我我做错了什么吗?谢谢。

2 个答案:

答案 0 :(得分:3)

您也可以尝试exists

select a.*
from Table_D a
where
    exists (
        select 1
        from Table_D b
        where a.Policynumber = b.Policynumber
              and a.BI_Limit <> b.BI_Limit
    )

答案 1 :(得分:0)

SELECT d.*
FROM   (   -- find the policy number with multiple listing and diff BI_Limit
           SELECT PolicyNumber
           FROM   TableD
           GROUP BY PolicyNumber
           HAVING   count(*) > 1
           AND      MIN (BI_Limit) <> MAX (BI_Limit)
       ) m -- join back the Table_D to for other information
       INNER JOIN Table_D d 
       ON  m.PolicyNumber = d.PolicyNumber