【问题标题】:Using aggregate (Count) on a linked SQL table在链接的 SQL 表上使用聚合 (Count)
【发布时间】:2017-03-06 19:27:17
【问题描述】:

我有一张名为 ITEMMASTER 的表。我还有一个名为 BOMMASTER 的表格(BOM 是物料清单)。每个都有一个字段 ITEMCODE 但没有直接链接。还有一个名为 BOMLINES 的表格。 BOMMASTER 将有 1 到多个 BOMLINES。

我想得到一个结果,显示 ITEMMASTER、等效的 BOMMASTER 和 BOM 中使用的总行数。但是,当我使用聚合 COUNT(tablename.fieldname) 时,它返回错误“SQL 错误代码 -104 选择列表中的无效表达式(不包含在聚合函数或 GROUP BY 子句中。)

我使用的(Firebird)SQL 查询是:

SELECT
ITEMMASTER.ITEMCODE, 
BOMLINES.ITEMCODE, 
COUNT(BOMLINES.LINECODE)
FROM BOMLINES, ITEMMASTER
WHERE ITEMMASTER.ITEMCODE = BOMLINES.ITEMCODE
GROUP BY BOMLINES.ITEMCODE

我也尝试了 LEFT JOIN,但得到了同样的错误。

我知道以下代码有效:

SELECT 
BOMLINES.ITEMCODE, 
COUNT(BOMLINES.LINECODE)
FROM BOMLINES BOMLINES
GROUP BY BOMLINES.ITEMCODE

但我想将它链接到 ITEMMASTER 表,这样我就可以在 ITEMMASTER 字段名上添加一个额外的 WHERE 子句。

我想我错过了一些非常基本的东西。

COUNT() 的目的是计算每个 BOM 有多少 BOMLINES。我不在乎 BOMLINES 是什么,只关心有多少。

所以下面的工作:

SELECT
ITEMMASTER.ITEMCODE,
ITEMMASTER.ADDITIONALFIELD_6,
COUNT(BOMLINES.LINECODE)
FROM BOMLINES 
JOIN ITEMMASTER ON ITEMMASTER.ITEMCODE = BOMLINES.ITEMCODE
GROUP BY ITEMMASTER.ITEMCODE, ITEMMASTER.ADDITIONALFIELD_6
ORDER BY ITEMMASTER.ITEMCODE, ITEMMASTER.ADDITIONALFIELD_6

所以我需要提及 GROUP BY 部分的 SELECT 中列出的所有字段?这似乎相当麻烦。谢谢BWS

【问题讨论】:

标签: sql count aggregate-functions firebird


【解决方案1】:

由于错误状态,您需要将 SELECT 中的所有项目包含在聚合或分组中...因此,请执行以下操作之一:

SELECT
ITEMMASTER.ITEMCODE, 
BOMLINES.ITEMCODE, 
COUNT(BOMLINES.LINECODE)
FROM BOMLINES
JOIN ITEMMASTER ON ITEMMASTER.ITEMCODE = BOMLINES.ITEMCODE
GROUP BY BOMLINES.ITEMCODE, ITEMMASTER.ITEMCODE
ORDER BY BOMLINES.ITEMCODE

-或者,简单地说-

SELECT
BOMLINES.ITEMCODE, 
COUNT(BOMLINES.LINECODE)
FROM BOMLINES
JOIN ITEMMASTER ON ITEMMASTER.ITEMCODE = BOMLINES.ITEMCODE
GROUP BY BOMLINES.ITEMCODE
ORDER BY BOMLINES.ITEMCODE

因为两个表中的 ITEMCODE 将是相同的。

【讨论】:

    【解决方案2】:

    关于您的问题的几点说明

    1. 您没有定义 BOMMaster 与 BOMLine 的关系
    2. 您没有指明您的计数究竟试图代表什么。 (BOM 上的行数?,BOM 上的项目数(如果同一项目在多行上,我们应该计算 1 还是 2?)
    3. 您了解分析(窗口)函数吗?

    .

    SELECT ITEMMASTER.ITEMCODE, 
           BOMLINES.ITEMCODE, 
           COUNT(BOMLINES.LINECODE) over (partition by BOMMaster.BomCode) as BOMItemCount
    FROM BOMLINES
    INNER JOIN ITEMMASTER
      ON ITEMMASTER.ITEMCODE = BOMLINES.ITEMCODE
    INNER JOIN BOMMASTER
      on BOMMaster.BOMCode = BOMLines.BOMCODE
    GROUP BY BOMLINES.ITEMCODE, BOMLines.ItemCode
    

    假设 bomcode 是 BomMaster 的主键,上述计数使用窗口函数来获取给定 bomcode 上的行数。

    【讨论】:

    • 窗口函数在 Firebird 中是相当新的(它们是在去年发布的版本 3 中引入的)。
    猜你喜欢
    • 2013-08-19
    • 2023-04-09
    • 1970-01-01
    • 2021-07-18
    • 1970-01-01
    • 2014-11-18
    • 1970-01-01
    • 2021-12-11
    • 2012-08-21
    相关资源
    最近更新 更多