我是SQL的新手,我正在尝试生成一个从各种不同的表中提取的报告。使用KEYS匹配零件的简单选择线没有问题。虽然我在尝试计算ITEMID在某些其他表中出现的次数时遇到了问题。
其中一个表格包含PARTID以及有关该部分的各种信息。然后另一个表有PARTID和ITEMID(每个部分有多个项目)。然后第三个表有一行ITEMID,显示列表中的每个新修复项目。
我希望能够为某个PARTID说出关联的ITEMID在第三个表格中显示多少次。我有一个代码如下:
SELECT
tblensembleunepiece.ENSPIECEID,
count(tblquarantaine.ITEMID) As 'Quarantine'
FROM tblensembleunepiece, tblitem, tblquarantaine
WHERE
tblensembleunepiece.NOPIECE<>''
and tblensembleunepiece.ENSPIECEID = tblitem.ENSPIECEID
and tblquarantaine.ITEMID = tblitem.ITEMID
GROUP BY tblensembleunepiece.ENSPIECEID;
仅此一项就为我提供了PARTID列表以及所有相关ITEMID显示在第三个表格中的次数。现在,如果我再次使用此代码相同的原则执行此操作:
SELECT
tblensembleunepiece.ENSPIECEID,
count(tblbonsortieitem.ITEMID)
FROM tblensembleunepiece, tblitem, tblbonsortieitem
WHERE
tblensembleunepiece.ENSPIECEID = tblitem.ENSPIECEID
and tblbonsortieitem.ITEMID = tblitem.ITEMID
and tblbonsortieitem.VAREVENIR = 'true'
GROUP BY tblensembleunepiece.ENSPIECEID;
这也可以单独使用,它会计算第三个表中与PARTID关联的所有ITEMID的行数。
当我尝试将它们全部组合时,问题出现了:
SELECT
tblensembleunepiece.ENSPIECEID,
tblensembleunepiece.NOPIECE As 'Part Number',
tblensembleunepiece.DESCRIPTIONENSP As 'Description',
tblensembleunepiece.QTEMIN As 'Min',
tblensembleunepiece.QTEMAX As 'Max',
tbltypepiece.TITRETYPE,
case
when CONSOMMABLE='true' Then 'Consumeable'
else 'Rotable' end As 'Utilization',
sum(tblitem.NBPOURPACK) As 'Serviceable',
count(case when tblquarantaine.BER = 'false' Then tblquarantaine.ITEMID else null end) As 'Quarantine Repairable',
count(case when tblquarantaine.BER = 'true' Then tblquarantaine.ITEMID else null end) As 'Quarantine BER/Scrap',
count(case when tblbonsortieitem.VAREVENIR = 'true' Then tblbonsortieitem.ITEMID else null end) As 'Repair Line'
FROM tblensembleunepiece, tbltypepiece, tblitem, tblquarantaine, tblbonsortieitem
WHERE
tblensembleunepiece.NOPIECE<>''
and tblensembleunepiece.TYPEPIECEID = tbltypepiece.TYPEPIECEID
and tblensembleunepiece.ENSPIECEID = tblitem.ENSPIECEID
and tblquarantaine.ITEMID = tblitem.ITEMID
and tblbonsortieitem.ITEMID = tblitem.ITEMID
GROUP BY tblensembleunepiece.ENSPIECEID;
由于我的WHERE语句,它会限制我现在看到的PARTID数量,因为我施加的条件太多而且列表中没有包含我需要查看的所有部分。
如何获得我想要的所有PARTID,然后在不强加所有WHERE条件的情况下将所需的值填入其他2列?如果他们没有出现在第三个表格中那么价值就只有零。
答案 0 :(得分:0)
因此,单个零件具有许多项目,并且单个修复作业将包含许多涉及修复的项目。
Parts table
PartId, PartName
1, front-bumper
2, radiator-grille
Items table
PartId, Itemid, ItemName
1, 1, front-bumper-shell
1, 2, fog-light-assembly
1, 3, parking-sensor
1, 4, headlamp-washer-jet
2, 5, grille-mesh-plastic
2, 6, grille-mesh-metal
2, 7, jaguar-emblem-badge
Repairs table
RepairID, ItemID, WorkDone
1, 1, crash damage replace broken shell
1, 2, crash damage replace broken fog light
1, 6, crash damage replace radiator grille
1, 7, crash damage replace badge
2, 3, fix parking sensor 1
2, 3, fix parking sensor 2
并且您想知道,对于每个维修工作,整个机器有多少不同的部件,更换了一些物品?
SELECT
RepairID, count(distinct PartId) as parts_affected
FROM
Repairs r
INNER JOIN
Items i
ON
r.ItemId = i.ItemId
如果我们所做的只是计算受影响的不同部分,则不需要加入零件表。第一项工作,前部碰撞损坏,影响两个部分(保险杠和格栅)。第二个工作,两个破损的停车传感器,只影响保险杠(1部分)
如果我没有正确地遵循您的要求,请通过评论告诉我 - 如果您可以根据我发布的表格来陈述您的问题,我会很感激(当示例表结构和数据时,总是更容易回答sql问题与预期的报告输出一起发布)或修改您的问题以获得样本数据和表结构以及查询的预期输出