【问题标题】:Joining Master table and two fact tables连接主表和两个事实表
【发布时间】:2018-11-02 19:37:34
【问题描述】:

我在加入数据时遇到问题。我有如下表格

表1

ID  AMT Product
1   10   P1
2   20   P1
3   30   P2
4   40   P2
5   10   P3

表2

ID1  AMT1
1   10
1   20
1   30
2   20
3   10

表3

ID3 AMT3
1   20
1   40
2   50
5   20

表 1 是主表,表 2 和 3 是事实表。 使用以下查询加入主表和事实表后,我输出了Result 详见附件。我使用以下查询来加入表格。

SELECT * 
FROM [dbo].[Table_1] a 
left join [dbo].[Table_2] b on a.ID=b.ID1 
Left Join [dbo].[Table_3] c on b.ID1=c.ID2

我想加入所有 3 个表,在产品级别聚合 AMT1 数据时加入后,我需要以下输出

Product Amt1
P1       80
P2       10

谁能指导我如何做到这一点。

谢谢

雷瓦蒂

【问题讨论】:

  • 您从哪里获得 P1 和 P2 的 80 和 10 值?这是 Amt1 和 Amt2 的平均总和吗?我怀疑是这样的,但在这一点上,我们必须猜测你想要做什么
  • 如果您有用于得出这些数字的公式,请将其包含在您的问题中
  • 是产品级别的聚合总和。
  • 那么,对于每个 P1、P2 等,您想要所有行中 Amt1 和 Amt2 的总和?
  • 是的,我需要所有行中 Amt1 和 Amt2 的总和

标签: sql sql-server sql-server-2008


【解决方案1】:

经过一番讨论并再次查看数据后,我了解您在寻找什么以及问题所在。如果 AMT1 和 AMT2 值有多个唯一组合,则它们的值将重复。下面的解决方案可能不是最有效的,但它使用UNION 分别执行每个连接,AMT 的空值不包含在查询的该部分中:

SELECT z.Product, SUM(z.AMT1), SUM(z.AMT2) 
FROM (
    SELECT a.Product, b.AMT1, NULL as 'AMT2'
    FROM [dbo].[Table_1] a 
    left join [dbo].[Table_2] b on a.ID=b.ID1
UNION ALL
    SELECT a.Product, NULL as 'AMT1', b.AMT2
    FROM [dbo].[Table_1] a 
    left join [dbo].[Table_3] b on a.ID=b.ID2
) as 'z' 
GROUP BY z.Product;

注意:这也纠正了连接逻辑中的问题。这两个表都需要基于包含Product 的表进行连接,因为您是按Product 字段分组,而不是连接Table_2 和Table_3

【讨论】:

  • 当我执行上述查询时,我得到 P1 为 140,P2 为 10,但根据事实表 2,我应该得到 P1 的 AMT1 为 80,P2 为 10。
猜你喜欢
  • 2023-04-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-03
  • 2014-11-02
  • 2017-01-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多