Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/60.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 比较一个表中字段的值与另一个表中多个字段的总和_Mysql_Sql_Join - Fatal编程技术网

Mysql 比较一个表中字段的值与另一个表中多个字段的总和

Mysql 比较一个表中字段的值与另一个表中多个字段的总和,mysql,sql,join,Mysql,Sql,Join,我有两张桌子 包装表:包装ID,数量 交易记录表:transactionid、packageid、数量 无论何时获得“包裹”,都会在“交易”表中输入一个条目以及获得的数量。可以执行多个“事务”,当完全获取包时,该包的所有事务的总和应等于包表中该包的数量 我想写一条SQL语句来检查是否未完全获取特定的packageid,即: 未执行任何交易 已执行交易,但所有交易的数量总和 交易记录少于数据包表中的数量 我怎样才能做到这一点?我尝试使用的每一个join都只针对第2个,但不考虑没有事务的包 我试

我有两张桌子

  • 包装表:包装ID,数量
  • 交易记录表:transactionid、packageid、数量
无论何时获得“
包裹
”,都会在“
交易
”表中输入一个条目以及获得的数量。可以执行多个“
事务”
,当完全获取包时,该包的所有事务的总和应等于包表中该包的数量

我想写一条SQL语句来检查是否未完全获取特定的packageid,即:

  • 未执行任何交易
  • 已执行交易,但所有交易的数量总和 交易记录少于数据包表中的数量
  • 我怎样才能做到这一点?我尝试使用的每一个join都只针对第2个,但不考虑没有事务的包

    我试过:


    从package.packageid=transactions.packageid其中package.quantity>sum(transactions.quantity)


    还尝试了左连接,但不起作用。理想情况下,我希望在结果的左表中列出所有包,必要时在右表中显示空值

    如果您希望包括没有事务的包,则需要。这将保留结果中的所有包,并匹配存在事务的事务

    然后您需要
    打包.packageid
    ,这样您的
    sum
    操作只对属于某个
    packageid
    交易
    记录有效

    然后使用一个类似于where子句的子句,它只适用于聚合函数,如
    sum

    select
      p.packageid,
      p.quantity,
      sum(t.quantity) as transaction_sum
    from
      packages p
      left outer join transactions t on (t.packageid = p.packageid)
    group by
      p.packageid,
      p.quantity
    having
      coalesce(sum(t.quantity), 0) != p.quantity
    ;
    
    合并只是说,“取第一个非空值。”因此,如果
    sum(t.quantity)
    返回
    null
    ,那么它将使用
    0
    。这将确保结果集中包含具有数量但没有事务的包


    我建议你仔细阅读一下小组讨论的内容。在使用sql时,它们是必不可少的。本质上,GROUPBY会根据数据的共同标准将数据拆分为多个组。然后根据组的质量筛选出某些结果。

    如果要包括没有事务的包,则需要。这将保留结果中的所有包,并匹配存在事务的事务

    然后您需要
    打包.packageid
    ,这样您的
    sum
    操作只对属于某个
    packageid
    交易
    记录有效

    然后使用一个类似于where子句的子句,它只适用于聚合函数,如
    sum

    select
      p.packageid,
      p.quantity,
      sum(t.quantity) as transaction_sum
    from
      packages p
      left outer join transactions t on (t.packageid = p.packageid)
    group by
      p.packageid,
      p.quantity
    having
      coalesce(sum(t.quantity), 0) != p.quantity
    ;
    
    合并只是说,“取第一个非空值。”因此,如果
    sum(t.quantity)
    返回
    null
    ,那么它将使用
    0
    。这将确保结果集中包含具有数量但没有事务的包


    我建议你仔细阅读一下小组讨论的内容。在使用sql时,它们是必不可少的。本质上,GROUPBY会根据数据的共同标准将数据拆分为多个组。然后根据组的质量筛选出某些结果。

    从package.packageid=transactions.packageid的package join事务中选择package.packageid、package.quantity、sum(transactions.quantity)
    也尝试了左连接,但不起作用。理想情况下,我希望左表中列出的所有包都具有右表中的空值,其中neeeded@AbcdfpqVpn把它放到问题中。
    从package.packageid=transactions.packageid其中package.quantity>sum(transactions.quantity)上的包联接事务中选择package.packageid、package.quantity、sum(transactions.quantity)
    也尝试了左联接,但不起作用。理想情况下,我希望左表中列出的所有包都具有右表中的空值,其中neeeded@AbcdfpqVpn把它放在问题里。这个。。你能解释最后两行吗?他们是如何帮助实现这一结果的?thanks@AbcdfpqVpn另外,如果这个答案对你有帮助,你介意打一下我答案左边的“接受”复选标记吗。除了给你我增加一点代表性,这让未来的读者知道这个答案解决了你的问题。。你能解释最后两行吗?他们是如何帮助实现这一结果的?thanks@AbcdfpqVpn另外,如果这个答案对你有帮助,你介意打一下我答案左边的“接受”复选标记吗。除了给你我增加一点代表性,这让未来的读者知道这个答案解决了你的问题。