0

我正在尝试加入 3 个表...月、monthly_results 和 issue_results。每月只有一个monthly_results 记录,但每月有0 到n 个issue_results。当没有 Issue_results 时,我可以设置 Left Join 以获取 Month_results。我的问题是当我在一个月内有多个 issue_results 时。我只希望在我的结果集中出现一次month_results ...否则我们会在报告每月总数时重复计算结果。

例如,这里是表格

月 1,2,3

月度结果(月,份)
(1, 5000)
(2, 2500)
(3, 1000)

问题结果(问题、月份、订单)
(1,1,750)
(2,1,500)
(3,3,250)

当我加入表格时,我想看到以下内容:

(月、期、份、订单)
1, 1, 5000, 750
1, 2, , 500
2, , 2500,
3, 3, 1000, 250

使用左外连接我可以获得第二个月(正确填充没有问题),但不幸的是,我在第二个月得到以下重复的每月结果 1 ...

1, 1, 5000, 750
1, 2, 5000 , 500
2, , 2500,
3, 3, 1000, 250

非常感谢任何和所有建议。

4

2 回答 2

1

给定表格中没有足够的信息来确定 5000 份副本与第 1 个月中的哪个问题相关联。您要查找的结果显示与第 1 期而不是第 2 期关联的 5000 个副本,但表中没有信息可以区分。澄清:

包含第 1 个月信息的表格行如下:

每月结果:

    (Month, Copies)
    (1,5000)

问题结果:

    (Issue, Month, Orders)
    (1,1,750)
    (2,1,500)

这样看,您可以从 Monthly Results 表中看到,与 5000 个副本关联的唯一一条信息是第 1 个月。因此,当您加入 Issue Results 时,第1 个月的两个问题都匹配到 5000 个副本。

要获得您正在寻找的结果,或者:

1)您的第一个表需要包含问题(月,问题,副本)
2)或者您需要说明如何选择哪个问题“获取”副本(在这种情况下)每月有 >1 个问题)。sgeddes 提供了一个很好的解决方案,即当月的第一期是获取副本的问题。

于 2013-07-12T03:33:22.527 回答
0

根据您的 RDBMS,有不同的方法可以实现这一点。

这是一个MySQL解决方案:

SELECT M.Month, 
  I.Issue,
  @copies:=IF(@prevMonth=M.Month,NULL,M.Copies) copies,
  I.Orders,
  @prevMonth:=M.Month
FROM MonthResults M
  LEFT JOIN IssueResults I ON M.Month = I.Month
  JOIN (SELECT @copies:=0) t;

小提琴演示示例

这是一个更通用的方法,应该适用于大多数 RDBMS:

SELECT M.Month, 
  I.Issue,
  T.Copies,
  I.Orders
FROM MonthResults M
  LEFT JOIN IssueResults I ON M.Month = I.Month
  LEFT JOIN (
      SELECT Min(I.Issue) minIssue,
        M.Month, M.Copies
      FROM MonthResults M LEFT JOIN IssueResults I ON M.Month=I.Month
      GROUP BY M.Month, M.Copies
) t ON M.Month = t.Month AND (I.Issue = t.minIssue OR I.Issue IS NULL)

还有另一个小提琴演示

于 2013-02-22T21:50:20.297 回答