1

我对 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,然后将我需要的值填写到其他 2 列中而不强加所有 WHERE 条件?如果它们没有出现在第三个表中,那么该值将简单地为零。

4

1 回答 1

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 问题总是更容易具有预期的报告输出)或修改您的问题以具有示例数据和表结构以及查询的预期输出

于 2017-12-16T23:43:05.580 回答