2014-04-09 39 views
1

enter image description hereSQL查询过滤不给我正确的结果

我有上表中,我试图运行一个查询,其中,我想告诉所有的记录,其中MSTRNMBR(第二场)有不止一个唯一的客户。

所以在上面的快照中,只有MstrNmbr ='97869'有两个不同的custNmbr。

我想用下面的查询,但我做错了什么。任何人都可以请建议如何获得以上结果我期待。

SELECT MSTRNUMB,SUM(1),CUSTNMBR 
    FROM SOP30200 
    WHERE 2 >= 2 group by MSTRNUMB,CUSTNMBR 

基本上我不想在custnmbr上组,但只在MSTRNMBR字段。

对不起,如果这是一个基本的问题。

回答

2

这里是查询让所有MSTRNUMB有两个以上不同的CUSTNMBR并同时获得一个逗号所有CUSTNMBR分隔列表

Select MSTRNUMB, 
     STUFF(
      (SELECT ',' + CUSTNMBR FROM SOP30200 
      FOR XML PATH('')), 
      1, 1, '') AS Output 

from SOP30200 
group by MSTRNUMB 
HAVING COUNT(DISTINCT CUSTNMBR) > 1 

如果你想看到这样的MSTRNUMB相关联的所有CUSTNMBR那么你可以使用下面的SQL

SELECT * 
FROM SOP30200 
WHERE MSTRNUMB IN (
    SELECT MSTRNUMB 
    FROM SOP30200 
    group by MSTRNUMB 
    HAVING COUNT(DISTINCT CUSTNMBR) > 1 
) 
+0

我看不到第二列,我猜是你查询中的custnmbr。我应该做些什么才能显示custnmbr。当前查询得到执行,查询输出中的第二列(这是custnmbr)就像这么长,我甚至不能扩展它。 sop30200表拥有多达100万条记录。 – Anirudh

+0

您是否试图检索与此类MSTRNUMB关联的所有CUSTNMBR?如果有,请参阅更新后的查询。 – Abhi

1

使用GROUP BYHAVING

SELECT MstrNumbr, count(MstrNumbr) as DistinctCustomerCount 
    FROM 
    (
     SELECT DISTINCT MstrNumbr, CustNmbr 
     FROM SOP30200 
    ) a 
    GROUP BY MstrNumb 

编辑:更新。上面的查询将只给你这是与多个CustNmbr相关的MstrNumbers,下方一个也会给你这些不同客户的列表(约后面的逗号抱歉)

SELECT MstrNumbr 
     ,(SELECT DISTINCT CustNmbr + ',' 
     FROM SOP30200 s1 
     WHERE s1.MstrNumbr = s2.MstrNumbr 
     FOR XML PATH(''), type).value('.', 'varchar(max)') as Customers 
    FROM SOP30200 s2 
    GROUP BY MstrNumbr 
    HAVING COUNT(MstrNumbr) > 1 
+0

我运行了您的查询,并在原始问题中显示了我的表格数据快照中的97870和97871。所以只能显示97869。我猜查询显示为custnmbr> 1,但只有当同一个mstrnmbr有多个客户时才显示。请告诉我。 – Anirudh