我有一张名为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
答案 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)
关于你的问题的一些事情
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的主键。