使用每对一个公共列连接表

时间:2015-12-18 11:28:54

标签: sql-server excel tsql join sql-server-2008-r2

早上好,

我收到了一份命令,要在excel中合并一份报告,其中包含我从SQL Server DB中提取的信息。我有这些表需要加入,如下:

DID           DName
1            Finance
2            Engineering
3            Administration

用户

UID            UName           RID
1           Takamiya Aido      5
2           Yagari Touga       4
3           Kain Akatsuki      3
4           Kuran Kaname       2
5           Kiryuu Zero        1

作用

RID        RName
1         Executive Secretary
2         Maintenance Supervisor
3         Boilermaker
4         Fitter
5         Payroll Clerk

元数据

MID      RID         Value
1         3        Engineering
2         2        Engineering
3         4        Engineering
4         5        Finance
5         1        Administration

CostCenters

CID      Code       Description
1        154      Administration
2        263      Mobiles
3        363      Services
4        554      General Accounts
5        654      Payroll Processing

DeptCost

ID      DID     CID
1       1        5
2       2        2
3       2        3
4       3        1
5       3        4

我使用的代码如下:

SELECT D.DName, U.UName, R.RName, C.Code, C.Description
FROM Department D
INNER JOIN MetaData MD ON D.DptName = MD.Value
INNER JOIN User U ON MD.RoleID = U.RoleID
INNER JOIN Role R ON U.RoleID = R.RID
FULL JOIN DeptCost DC ON D.DeptID = DC.DeptId
FULL JOIN Cost C ON DC.CostId = C.CId
ORDER BY MD.Value

预期结果如下:

Dname             UName           RName               Code      Description
Finance          Takamiya Aido     Payroll Clerk       654     Payroll Proc
Engineering      Yagari Touga      Fitter              263     Mobiles
Engineering      Kain Akatsuki     Boilermaker         363     Services
Engineering      Kuran Kaname      Maintenance Sup
Administration   Kiryuu Zero       Executive Secretary 154  Administration
Administration                                         554  General Accounts

实际结果如下:

Dname             UName           RName               Code      Description
Finance          Takamiya Aido     Payroll Clerk       654     Payroll Proc
Engineering      Yagari Touga      Fitter              263     Mobiles
Engineering      Yagari Touga      Fitter              363     Services
Engineering      Kain Akatsuki     Boilermaker         263     Mobiles
Engineering      Kain Akatsuki     Boilermaker         363     Services
Engineering      Kuran Kaname      Maintenance Sup     263     Mobiles
Engineering      Kuran Kaname      Maintenance Sup     363     Services
Administration   Kiryuu Zero       Executive Secretary 154  Administration
Administration   Kiryuu Zero       Executive Secretary 554  General Accounts         

我在HereHereHere以及Google中尝试过这些解决方案。我可以得到部门和用户,部门和成本,但我不能做他们三个。要获得部门中的用户,我必须从MetaData能够获得部门,将其与角色一起加入,并从角色获取用户表。如您所见,Depts和Cost Center是直截了当的。

我已经尝试了从这里的示例中得到的其他选项,但没有得到预期的结果。如果你说只有CTE或分区是解决方案,那么请让它们成为解决方案,因为我已经尝试过,我无法清楚地解释它们是如何工作的,对某些人来说可能很简单,但我不能抓住它。不知道如果没有它我将如何获得我的MCSE。

如果这在SQL中不起作用,只有Excel本身就是解决方案,我会指导自己。如果没有手动伪造数据,然后随便向我的老板说明为什么它不会自动更新,我就不会这样做。

任何进一步的解释,请问。哦,无法触及数据库结构,并且由于机密性而忽略了某些数据。

提前致谢。

编辑: 老板想按部门列出所有用户,他想要每个部门的成本中心。我在Excel中创建了包含2个工作表的报告,一个用于用户,另一个用于成本中心,但是他要求在同一张纸上将它们放在一起。

因此,您可能只有1个成本中心但有5名员工的部门,或者您可能拥有5个成本中心和3个员工的部门。实际上,用户和成本中心只有共同的部门,而不是相关的部门。

这是要求的小提琴。 http://sqlfiddle.com/#!3/477d9/1

1 个答案:

答案 0 :(得分:1)

在查询中的ORDER BY之前添加此子句:

GROUP BY D.DName, U.UName, R.RName

然后编写聚合函数或子查询,以强制执行计算CodeDescription所需的规则。

从您的问题中不清楚这些规则是什么。例如,对于Yagari Touga,为什么在最终结果中需要Mobiles而不是Services?如果您不告诉我们逻辑是什么,我无法告诉您如何对逻辑进行编码。