由于WHERE,SQL计数功能没有限制列表

问题描述 投票:1回答: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;

仅此一项就为我提供了PARTIE列表以及所有关联的ITEM ID显示在第三个表中的次数。现在,如果我再次使用此代码相同的原则执行此操作:

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列?如果他们没有出现在第三个表格中,那么价值就会为零。

mysql sql database where-clause
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问题使用预期的报告输出)或修改您的问题以获得样本数据和表结构以及查询的预期输出

© www.soinside.com 2019 - 2024. All rights reserved.