2017-04-04 81 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。但我真的建议你问另一个问题并添加你的实际查询。不要改变这个问题,因为它已经有了答案,而且这样的改变很可能会使答案失效并且画下来。对现有查询的更改可能会更简单。 –

相关问题