【问题标题】:Join Tables with One Common Column Per Pair使用每对一个公共列连接表
【发布时间】:2016-03-25 02:30:51
【问题描述】:

早安,

我接到命令将 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

成本中心

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

部门成本

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 中的解决方案。我可以得到 Dept 和 Users、Dept 和 Costs,但我不能做到这三个。要获取部门中的用户,我必须从 MetaData 中获取部门,将其与角色连接起来,并从角色中获取用户表。如您所见,部门和成本中心是直截了当的。

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

如果这在 SQL 中不起作用并且只有 Excel 本身是解决方案,我将自己引导到那里。没有手动伪造数据然后向我的老板随机找借口解释为什么它不自动更新,我不明白这一点。

任何进一步的解释,只是问。哦,不能动DB结构,有些数据因为保密原因被省略了。

提前致谢。

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

因此,您的部门可能只有 1 个成本中心但有 5 名员工,或者您的部门可能有 5 个成本中心和 3 名员工。实际上,用户和成本中心只有部门的共同点,本身没有关联。

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

【问题讨论】:

  • 您有 两个 DeptCosts 用于某些部门,并且无法让系统知道您喜欢哪个 一个。它怎么知道,对于某些成本中心行,您想删除某些user 列?你需要告诉它。然而,这似乎是前端的一项工作,根据前一行进行空白 - 不是真正的数据库引擎,它正在做它应该做的事情。一些 SQL 方言确实有这类命令,但我不确定 2008 R2 是否有。
  • 尝试使用sqlfiddle.com 使用您的查询创建表和数据,并在此处发布小提琴。这将使我们更容易为您提供帮助。

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


【解决方案1】:

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

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

然后编写聚合函数或子查询来强制执行您想要计算CodeDescription 的规则。

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

【讨论】:

    猜你喜欢
    • 2020-01-23
    • 2022-08-19
    • 2019-08-26
    • 2023-04-05
    • 2021-09-20
    • 1970-01-01
    • 2015-11-11
    • 1970-01-01
    • 2017-11-17
    相关资源
    最近更新 更多