2017-04-04 85 views
0
driverphone| drivername|guarantor1_phone|guarantor2_phone 
--------------------------------------------------------- 
0801  |Mr A  |0803   |0802 
0802  |Mr B  |0804   |0801 
0803  |Mr C  |0805   |0801 
0804  |Mr D  |0802   |0805 
0805  |Mr E  |0801   |0803 

我想要得到這樣的結果在SQL Server我想做到這一點在SQL Server

driverphone| drivername|Total Guaranteed 
---------------------------------------- 
0801  |Mr A  | 3 
0802  |Mr B  | 2    
0803  |Mr C  | 2 
0804  |Mr D  | 1 
0805  |Mr E  | 2 

那就是選擇由每個驅動程序保證總數設置。 司機 - >擔保人關係是基於電話號碼。

+2

你嘗試過這麼遠嗎? –

+5

看起來像一張糟糕的桌子設計。 「1」和「2」的名稱是否重要?如果是這樣,它們應該被建模爲* data *,而不是作爲* metadata *存儲(即在列名稱內)。保證人應該作爲*行*存儲在一個單獨的表格中(可選地將'1' /'2'數據存儲在一個單獨的列中),然後這個查詢很簡單(並且您的數據建模得更好) –

+3

「我想使這發生在SQL Server中「不是一個非常明顯的標題。請編輯它,並告訴我們你已經嘗試了什麼,以及你的思考過程是如何處理數據的。 – Jonast92

回答

2

不要讓LEFT JOIN既保證人列和做它的一個重複計數。

模式:

CREATE TABLE #TAB (
    driverphone VARCHAR(10) 
    ,drivername VARCHAR(10) 
    ,guarantor1_phone VARCHAR(10) 
    ,guarantor2_phone VARCHAR(10) 
    ) 


INSERT INTO #TAB 

SELECT '0801',' Mr A', '0803', '0802' 
UNION ALL 
SELECT '0802',' Mr B', '0804', '0801' 
UNION ALL 
SELECT '0803',' Mr C', '0805', '0801' 
UNION ALL 
SELECT '0804',' Mr D', '0802', '0805' 
UNION ALL 
SELECT '0805',' Mr E', '0801', '0803' 

現在不要選擇像下面

SELECT T.driverphone 
    ,T.drivername 
    ,COUNT(DISTINCT T2.driverphone) + COUNT(DISTINCT T3.driverphone) 
FROM #TAB T 
LEFT JOIN #TAB T2 ON T.driverphone = T2.guarantor1_phone 
LEFT JOIN #TAB T3 ON T.driverphone = T3.guarantor2_phone 
GROUP BY T.driverphone 
    ,T.drivername 

結果將是

+-------------+------------+------------------+ 
| driverphone | drivername | (No column name) | 
+-------------+------------+------------------+ 
|  0801 | Mr A  |    3 | 
|  0802 | Mr B  |    2 | 
|  0803 | Mr C  |    2 | 
|  0804 | Mr D  |    1 | 
|  0805 | Mr E  |    2 | 
+-------------+------------+------------------+ 
+1

謝謝@Shakeer Mizra,你做了一個完美的作品。祝福你 –

+1

高興地幫助:) –

1

我認爲最簡單的方法是outer apply

select t.driverphone, t.drivername, g.totalguaranteed 
from t outer apply 
    (select count(*) as totalguaranteed 
     from (values (guarantor1_phone), (guarantor2_phone)) v(guarantor) 
     where v.guarantor = t.driverphone 
    ) g; 
+0

請,我給出的圖是物理表的抽象。表名不會反映在您的查詢中。請你可以使用表名嗎?在我的情況下,我的表是一個連接(tbldrivers.driverphone = guarantors.driverphone中的保證人內連接tbldrivers) –

+0

@FALETINO。 。 。 't'是表名。您可以在當前查詢中使用CTE。但我真的建議你問另一個問題並添加你的實際查詢。不要改變這個問題,因爲它已經有了答案,而且這樣的改變很可能會使答案失效並且畫下來。對現有查詢的更改可能會更簡單。 –

相關問題