【问题标题】:How do I use Count in a SUM function with inner and outer joins如何在具有内部和外部联接的 SUM 函数中使用 Count
【发布时间】:2019-11-23 20:50:15
【问题描述】:

感谢您帮助我找到解决这个我无法弄清楚的 SQL 的方法。

在我的 SQL 语句中,我有 1 个内部联接和 1 个外部联接。其中一个求和需要计算从内部连接返回的行数

Table 1             

Location |Date       |Column3 |Column4
1        |11/22/2019 |23      |3
2        |11/22/2019 |23      |4
3        |11/22/2019 |12      |5
4        |11/22/2019 |54      |6
5        |11/22/2019 |65      |7
6        |11/22/2019 |23      |8
7        |11/22/2019 |5       |9

Table 2         

Location |Date       |Column3 |Column4 |Column5
1        |11/22/2019 |1       |8.5     |06
1        |11/22/2019 |2       |8.5     |06
1        |11/22/2019 |3       |8       |06
1        |11/22/2019 |4       |8.5     |06
2        |11/22/2019 |5       |7.5     |06 
2        |11/22/2019 |5       |8.5     |06
2        |11/22/2019 |6       |8.5     |06

Table 3         
Location |Date       |Column3 |Column4 |Column5 
1        |11/22/2019 |3       |3       |1
2        |11/22/2019 |4       |4       |0
3        |11/22/2019 |6       |5       |1
4        |11/22/2019 |25      |6       |0
5        |11/22/2019 |65      |7       |1
6        |11/22/2019 |65      |8       |0
7        |11/22/2019 |78      |9       |1

我的错误陈述,需要在第 5 行计数

SELECT 
T3.Location AS Location, 
T3.Date AS [Date],
SUM(T1.Column3- (T2.Column3+ T2.Column4)) as Result_Numerator,
SUM(T1.Column4 - COUNT(T2.Column2)) AS Result_Denominator,
SUM(T3.Column3 - T3.Column4) as Plan_Numerator,
SUM(T3.Column4 - T3.Column3) as Plan_Denominator,
'Element Name' as Element

FROM Table1 T1 
INNER JOIN 
Table2 T2 ON T1.Date= T2.Date AND T1.Location = T2.Location
RIGHT OUTER JOIN
Table3 T3 ON T1.Date = T3.DATE and T3.Location = P.Location

WHERE T1.Location = '1' AND (T3.Date>({ts '2019-11-01 00:00:00'})) 
AND T3.Column5 = '0' AND T2.Column3>0 AND T2.Column5 ('05','06')

GROUP BY T3.Location, 
T1.CNY_CD,
T3.PLN_DATE,

我查看了一些类似的问题,他们建议先使用 union all 来获取计数,但我不完全理解如何使用 T1 和 T2 之间的内部连接来实现这一点。

非常感谢您帮助我 D

【问题讨论】:

  • 我还不明白你到底想选择什么。你能显示你想要的结果吗?桌子的钥匙是什么? table1table3Location 吗?
  • 顺便问一下,您的 DBMS 是什么? MySQL? SQL 服务器? ...
  • 我正在使用 SQL Server
  • 以位置 1 为例,我想要的结果是 Location =1 Date = 11/22/2019 Result_Denominator = 3 - 4
  • 在不知道表的键是什么的情况下,我只能猜测您到底需要什么查询。但在我看来,解决您的问题的方法似乎很明显,您应该首先汇总需要汇总的内容,然后才加入。我已经发布了一个显示这个的答案。

标签: sql sql-server


【解决方案1】:

RIGHT JOIN 令人困惑。 请改用 LEFT JOIN。

Table2 可能还需要 LEFT JOIN。
但是,Table2 上的标准都应该在 ON 中,而不是在 WHERE 子句中。或者它的行为就像一个 INNER JOIN。

...
FROM Table3 T3
LEFT JOIN Table2 T2 
  ON T2.Date= T3.Date 
 AND T2.Location = T3.Location
 AND T2.Column3 > 0 
 AND T2.Column5 IN ('05','06')
LEFT JOIN Table1 T1 
  ON T1.Date = T3.Date
 AND T1.Location = T3.Location
WHERE T3.Location = '1' 
  AND T3.Date >= CAST('2019-11-01' AS DATE)
  AND T3.Column5 = '0' 
GROUP BY T3.Location, T3.Date

【讨论】:

    【解决方案2】:
    select inner_sum = (Select SUM(...) as inner_sum from Table 1
    inner join Table2 on Table2.Date = Table1.Date and Table2.Location = Table1.location), outer_sum = SUM(....)
    ... the rest of your statement 
    

    阅读更多:SQL Subquery

    看来可以直接将子查询的结果赋值给列名,功能相当强大!但是子查询很慢,我相信使用联合有更好的方法。

    Select SUM(...) as inner_sum from Table1 
    inner join Table2 on Table2.Date = Table1.Date and Table2.location = Table1.location
    UNION
    Select SUM(...) as outer join
    ....
    

    【讨论】:

    • 这是否允许我在第 5 行的 Sum 中使用 Count 函数?
    • 是的,应该,因为据我了解,您遇到的问题是先从内部联接中获取总和,然后从外部联接中获取总和,对吗?
    【解决方案3】:

    您没有在请求中显示预期结果,也没有告诉我们表的键是什么。我假设以下键:

    • table1(位置、日期)
    • table2(无)
    • table3(位置、日期)

    似乎(但我可能错了)您希望每个位置和日期都有一个结果行。这意味着您必须聚合 table2 数据。

    我不知道您的查询中哪些表数据是必需的,哪些不是。看起来您想从 table3 中进行选择,它可能在 table1 和 table2 中有匹配项,也可能没有匹配项。

    许多假设,因为您的请求缺少所有这些信息。下次请更准确地描述您的表格、它们的关系以及您想要的结果。

    with t2 as
    (
      select location, date, sum(column3) as sum3, sum(column4) as sum4, count(*) as cnt
      from table2
      where column3 > 0 and column5 in ('05', '06')
      group by location, date
    )
    select
      t3.location, 
      t3.date,
      t1.column3- (t2.sum3 + t2.sum4) as result_numerator,
      t1.column4 - t2.cnt as result_denominator,
      t3.column3 - t3.column4 as plan_numerator,
      t3.column4 - t3.column3 as plan_denominator
    from table3 t3
    left join table1 t1 on t1.location = t3.location and t1.date = t3.date
    left join t2 on t2.location = t3.location and t2.date = t3.date
    where t3.location = 1 and t3.date >= '2019-11-02' and t3.column5 = 0
    order by t3.location, t3.date;
    

    根据所有这些猜测,您可能需要调整此查询,但您明白了。

    【讨论】:

    • 只是备注:我在这里使用了WITH 子句以提高可读性,但如果您更喜欢这样的话,您也可以将聚合查询放在FROM 子句中:@987654324 @.
    • 谢谢你的上述,我正在努力回顾和了解发生了什么。在回答您的问题时,表之间没有关系键。表 3 只是对自身求和,因为它是计划数据。我遇到的主要问题是让计数起作用。
    猜你喜欢
    • 2013-10-26
    • 1970-01-01
    • 2011-01-24
    • 2011-09-18
    • 1970-01-01
    • 2022-01-24
    • 2015-06-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多