2016-10-05 254 views
1

我一直在試圖構建這個查詢,但是對於SQL來說是新的,所以我非常感謝一些幫助。選擇在一列中具有相同值但在另一列中具有不同值的行

在下面的示例中,我有一個客戶代碼,一個鏈接的客戶代碼(用於將子客戶鏈接到父客戶),銷售人員和其他不相關的列。目標是爲每位父母顧客提供一名銷售人員,並且這是他們的孩子。因此,在此示例中,CustCode#100是其自身的父代,#200,#500和#800。所有這些帳戶都有相同的銷售人員(JASON),這非常完美。但對於CustCode#300,它是它自己的父親,#400和#600。但是,沒有一個銷售人員被分配 - 它既是JIM也是SUZY。我想建立一個查詢,顯示這個例子的所有帳戶。基本上,銷售人員字段與其所有子級客戶的價值不同。

我試過銷售員<>銷售員的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

所以,數據表上方都在一個表 - 你在這一點上沒有使用任何連接,對吧?你有沒有任何示例SQL代碼?如果你只想要CustCode,Linked和Salesperson的不同值,你應該可以使用'select distinct custcode,[linked custcode],salesperson from table' – Aron

+0

發佈一些示例輸出 – Teja

+0

嗨,這個問題解決了嗎?你需要進一步的幫助嗎? – Shnugo

回答

1

該解決方案使用遞歸CTE首先建立層次結構,並找到每行的首代碼,即使代碼鏈接指向它指向一個上一行本身一行。

最後的查詢示出了不同的銷售人員的計:

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'); 

--The查詢

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 
0

您可以在桌上自行加入。

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