【问题标题】:Count and result from Inner Join内部联接的计数和结果
【发布时间】:2023-03-27 17:13:01
【问题描述】:

我有这个问题

SELECT COUNT(*) FROM (
SELECT
  ART.LFDNR,
  ARTSTLST.ARTIKELLFDNR,
  Count(*) AS counts
FROM
  ARTIKEL ART
  INNER JOIN ARTSTLST ON ARTSTLST.OARTIKELLFDNR = ART.LFDNR
WHERE
  ART.SUCHARTIKELNR = '22424'
GROUP BY
  ART.LFDNR,
  ARTSTLST.ARTIKELLFDNR            ) 

这导致我的情况

3

但我也想显示内部查询的结果

SELECT
  ART.LFDNR,
  ARTSTLST.ARTIKELLFDNR,
  Count(*) AS counts
FROM
  ARTIKEL ART
  INNER JOIN ARTSTLST ON ARTSTLST.OARTIKELLFDNR = ART.LFDNR
WHERE
  ART.SUCHARTIKELNR = '22424'
GROUP BY
  ART.LFDNR,
  ARTSTLST.ARTIKELLFDNR  

所以结果应该是这样的

12345        34567        3

这是 selct 加上 Count() 结果的结果。

【问题讨论】:

  • 请详细说明,分享结果应该是什么样子。
  • 花时间描述您的数据是什么样的以及您想要什么样的结果。如果你连这个问题都不努力,为什么有人要努力回答呢?
  • 我把整个问题改了,我觉得很清楚。
  • 不是,对我来说仍然不是。如果计数为 3,则表示子选择有 3 行。那么,您为什么希望最终输出为单行?您希望如何从 3 行输入中获取它?

标签: sql firebird


【解决方案1】:

使用窗口聚合函数会很容易:

SELECT
  ART.LFDNR,
  ARTSTLST.ARTIKELLFDNR,
  Count(*) AS counts,
  SUM(Count(*)) OVER () -- Group sum
FROM
  ARTIKEL ART
  INNER JOIN ARTSTLST ON ARTSTLST.OARTIKELLFDNR = ART.LFDNR
WHERE
  ART.SUCHARTIKELNR = '22424'
GROUP BY
  ART.LFDNR,
  ARTSTLST.ARTIKELLFDNR  

但 AFAIK 只有 Firebird 3(目前处于测试阶段)支持这些功能,因此您需要使用公用表表达式进行更复杂的查询:

WITH cte AS
  ( 
    SELECT
      ART.LFDNR,
      ARTSTLST.ARTIKELLFDNR,
      Count(*) AS counts
    FROM
      ARTIKEL ART
      INNER JOIN ARTSTLST ON ARTSTLST.OARTIKELLFDNR = ART.LFDNR
    WHERE
      ART.SUCHARTIKELNR = '22424'
    GROUP BY
      ART.LFDNR,
      ARTSTLST.ARTIKELLFDNR  
 ) 
SELECT cte.*, (SELECT SUM(counts) FROM cte)
FROM cte

【讨论】:

  • 哇,我实际上认为这很容易,只是我缺乏知识,但我问得很好,这对我来说是无法解决的。谢谢!
猜你喜欢
  • 2020-05-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-13
  • 2016-07-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多