2017-03-06 43 views
1

我有一個名爲ITEMMASTER的表。我也有一個名爲BOMMASTER的表(BOM是物料清單)。每個都有一個ITEMCODE字段,但不直接鏈接。還有另一個名爲BOMLINES的表。 BOMMASTER將有1到多個BOMLINES。在鏈接的SQL表上使用聚合(計數)

我想獲得顯示ITEMMASTER,BOMMASTER和物料清單中使用的總行數的結果。但是,當我使用聚合COUNT(tablename.fieldname)時,它返回一個錯誤「SQL錯誤代碼-104選擇列表中的無效表達式(不包含在聚合函數或GROUP BY子句中)。

我用(火鳥)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 

所以我需要提一下節組中選擇列出的所有領域?這似乎相當麻煩。感謝您的BWS

+1

[不良習慣踢:用舊式的JOIN - 亞倫伯特蘭](http://sqlblog.com/blogs/aaron_bertrand/archive/2009/10/08/bad-habits-to-kic使用老的風格,加入K-。aspx) – SqlZim

+0

Firebird支持分析功能嗎? https://www.firebirdsql.org/file/documentation/release_notes/html/en/3_0/rnfb30-dml-windowfuncs.html也想想你的顯示。如果你想顯示具體的項目,什麼「計數」是你尋找的物品或總數的項目?嘲笑一些預期的結果我認爲這將有助於解決你的問題。 – xQbert

回答

2

由於錯誤狀態,你需要在兩種聚合或組中選擇所有項目......所以,請執行下列操作之一:

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 

-or,只要 -

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

因爲兩個表中的ITEMCODE都是相同的。

0

你的問題

  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假設bomcode的行數是BomMaster的主鍵

+0

Firebird中的窗口功能非常新(它們是在去年發佈的第3版中引入的)。 –