Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/78.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql SQL计数函数,不限制列表,因为_Mysql_Sql_Database_Where Clause - Fatal编程技术网

Mysql SQL计数函数,不限制列表,因为

Mysql SQL计数函数,不限制列表,因为,mysql,sql,database,where-clause,Mysql,Sql,Database,Where Clause,我对SQL非常陌生,我正在尝试生成一个从各种不同的表中提取的报告。将零件与关键点匹配的简单选择线没有问题。虽然我在计算ITEMID在某些其他表中显示的次数时遇到了问题 其中一个表有一个PARTID和关于该部分的各种信息。然后另一个表有PARTID和ITEMID,每个部分有多个项。然后,第三个表中有一行ITEMID,它为列表中的每个新修复项显示 我想说的是,对于某个PARTID,关联的itemid在第三个表中显示了多少次。我的代码如下: SELECT tblensembleunepiec

我对SQL非常陌生,我正在尝试生成一个从各种不同的表中提取的报告。将零件与关键点匹配的简单选择线没有问题。虽然我在计算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,
    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语句,它限制了我现在看到的部分的数量,因为我施加了太多的条件,并且列表中没有包括我需要查看的所有部分


如何获得所需的所有分区,然后将所需的值填充到其他两列中,而不施加所有WHERE条件?如果它们没有出现在第三个表中,那么该值将为零。

因此,单个零件有许多项目,单个维修作业将有许多项目参与维修

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
如果我们所做的只是计算受影响的不同部分,则不需要加入parts表。第一项工作,前部碰撞损坏,影响保险杠和格栅的两部分。第二项工作是两个损坏的驻车传感器,仅影响保险杠1部件


如果我没有正确地遵循你的要求,通过评论让我知道-如果您能就我发布的表说明您的问题,我将不胜感激。当示例表结构和数据与预期的报告输出一起发布时,回答sql问题总是比较容易,或者如果您愿意,请修改您的问题,以获得示例数据和表结构以及预期的查询输出

如果您是SQL新手,您应该知道隐式连接是一种非常糟糕的做法,是一种SQL反模式,在上个世纪被显式连接取代。你不应该再写这些了。还有一件事我不能使用很多函数,因为数据库是很久以前创建的,从那时起就没有更新过,我无法让任何人对此做任何事情,因为我是一名学生。显式连接会是什么样子?@nicomp,当你在学校遇到它时,你应该教育你的教授,让他知道教这个是多么不正确。@CaiusJard,隐式连接的问题与不准确有关,因为当它变得复杂时,缺少where子句,从而产生意外的交叉连接,并且缺乏对连接如何工作的理解,这意味着开发人员无法真正理解如何获得正确的结果。此外,左连接语法通常不准确,并且可能产生不正确的结果,特别是在SQL Server中。众所周知,结合左连接显式语法和内连接隐式语法也会创建奇怪的结果集。而且你无法判断交叉连接是否是有意的。
SELECT
  RepairID, count(distinct PartId) as parts_affected
FROM
  Repairs r 
  INNER JOIN 
  Items i 
  ON
    r.ItemId = i.ItemId