选择一列中具有相同值但在另一列中具有不同值的行

时间:2016-10-05 20:02:58

标签: sql sql-server

我一直在尝试构建这个查询,但我是SQL的新手,所以我真的很感激一些帮助。

在下表示例中,我有一个客户代码,一个链接的客户代码(用于将子客户链接到父客户),销售人员和其他不相关的列。目标是为每位父母客户及其子女提供一名销售员。因此,在示例中,CustCode#100是其自身的父级,#200,#500和#800。所有这些帐户都有相同的销售人员(JASON),这是完美的。但对于CustCode#300,它是其自身的父级,#400和#600。但是,没有一个销售人员 - 它既有JIM又有SUZY。我想构建一个显示此示例的所有帐户的查询。基本上,Salesperson字段与其所有子客户的值不同的帐户。

我为Salesperson<>尝试了Where子句销售人员,但它没有显示正确。

+-----------+-----------------+------------+----------------------+
| CustCode  | Linked CustCode | Salesperson| additional columns...|
+-----------+-----------------+------------+----------------------+
| 100       |       100       |    JASON   |          ...         |
| 200       |       100       |    JASON   |          ...         |
| 300       |       300       |    JIM     |          ...         |
| 400       |       300       |    JIM     |          ...         |
| 500       |       100       |    JASON   |          ...         |
| 600       |       300       |    SUZY    |          ...         |
| 700       |       NULL      |    JIM     |          ...         |
| 800       |       100       |    JASON   |          ...         |
+-----------+-----------------+------------+----------------------+

非常感谢你的帮助!

2 个答案:

答案 0 :(得分:1)

此解决方案首先使用递归CTE来构建层次结构并找到每行的前导代码,即使链接的代码指向指向上行本身的行。

最终查询显示不同Salespersons的计数:

DECLARE @tbl TABLE(CustCode INT,[Linked CustCode] INT,Salesperson VARCHAR(100));
INSERT INTO @tbl VALUES
 (100,100,'JASON')
,(200,100,'JASON')
,(300,300,'JIM')
,(400,300,'JIM')
,(500,100,'JASON')
,(600,300,'SUZY')
,(700,NULL,'JIM')
,(800,100,'JASON');

- 查询

WITH CleanUp AS
(
    SELECT CustCode 
          ,CASE WHEN [Linked CustCode]=CustCode THEN NULL ELSE [Linked CustCode] END AS [Linked CustCode]
          ,Salesperson
    FROM @tbl
)
,recCTE AS
(
    SELECT CustCode AS LeadingCode,CustCode,[Linked CustCode],Salesperson
    FROM CleanUp
    WHERE [Linked CustCode] IS NULL

    UNION ALL

    SELECT recCTE.LeadingCode,t.CustCode,t.[Linked CustCode],t.Salesperson
    FROM recCTE
    INNER JOIN CleanUp AS t ON t.[Linked CustCode]=recCTE.CustCode
)
SELECT LeadingCode,COUNT(DISTINCT Salesperson) AS CountSalesperson
FROM recCTE
GROUP BY LeadingCode

结果

LeadingCode CountSalesperson
100         1
300         2
700         1

答案 1 :(得分:0)

你可以在桌上自我加入。

select distinct r2.* from 
table r1 
join table r2 
on
r1.linkedcustcode = r2.linkedcustcode and r1.salesperson <> r2.salesperson