在链接的SQL表

时间:2017-03-06 19:27:17

标签: sql count aggregate-functions firebird

我有一张名为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

2 个答案:

答案 0 :(得分:2)

如错误所述,您需要将SELECT中的所有项目包括在聚合或组中...所以,请执行以下操作之一:

void getUrlofAudioFile(CBRAudioFileRef userData) {
char *filePath = NULL;
OSStatus result = noErr;

filePath = (char *)malloc(sizeof(char) * PATH_LIMIT);
fprintf(stdout, "Please insert the full pathname of the audio file.\nPathname: ");
fgets(filePath, PATH_LIMIT, stdin);

CFURLRef audioFileURL = CFURLCreateFromFileSystemRepresentation(NULL, (Byte *)filePath, strlen(filePath),
                                                                       false);
if(!audioFileURL) printf("Can't parse file path.\n");

result = AudioFileOpenURL(audioFileURL, kAudioFileReadPermission, 0, &userData->queueId);

if(result != noErr) {
    printf("Unable to open AudioFile\n");
    exit(1);
}

CFRelease(audioFileURL);
free(filePath);

- 或者,简单 -

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

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

答案 1 :(得分:0)

关于你的问题的一些事情

  1. 您没有定义BOMMaster与BOMLine的关联方式
  2. 您没有说明您的计数究竟代表什么。 (物料清单上的行数?,物料清单上的物品数量(如果同一物品在多行上,我们应该计算1还是2?)
  3. 您是否了解分析(窗口)功能?
  4. 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的主键。