我一直在尝试构建这个查询,但我是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 | ... | +-----------+-----------------+------------+----------------------+
非常感谢你的帮助!
答案 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