如何编写从多个表中获取多行数量总和的查询?

Posted

技术标签:

【中文标题】如何编写从多个表中获取多行数量总和的查询?【英文标题】:How to write a query that get the sum of quantity of multiple rows from multiple tables? 【发布时间】:2017-09-25 22:06:35 【问题描述】:

我想编写一个查询,为我带来今天的销售额。我在数据库中使用了 4 个表。

第一个名为 drug 的表包含药物名称 第二个称为输出,它包含销售 ID 和日期 名为 outputdetails 的第三个表包含在特定销售中销售的药物。 名为 inputdetails 的第四个表包含进入商店的药品及其有效期

一种药物可能有多行,每个有效期都不同,我想得到今天销售的每种药物的数量总和。

这里是我正在使用的查询,但它给了我错误的数字:

select DrugID,
       Drugs.Name,
       sum(InputDetails.Quantity) as 'Quantity' 
from InputDetails 
inner join Drugs on Drugs.ID = InputDetails.DrugID 
cross join Output
inner join OutputDetails on OutputDetails.OutputID = Output.ID
group by DrugID, Name;

【问题讨论】:

我们可以查看示例数据以进行处理 除非你的结构有点奇怪,或者你的销售价格与传入的药物出货量相关,否则我看不出你为什么要对InputDetails.Quantity而不是OutputDetails.Quantity求和。当您将 OutputDetails 描述为“在特定销售中销售的药物”时,这应该是您的目标。 InputDetails 将是补给,可能等于也可能不等于销售量(例如:Vicodin 以每瓶 30 粒或更多药丸的形式提供。牙医的处方通常是 7、14 或 21 粒药丸。您必须订购另外 30 个,但只会卖出更少的数量。) 此外,您将隐式连接语法与显式连接混合在一起,在您的语句中显示为交叉连接,这几乎肯定不是您想要的。为清楚起见,始终使用显式连接。您可能想加入DrugId 或其他什么,但可用的标准尚不清楚;这可能是重复的主要驱动因素。 Laughing Vergil 感谢您的回复....我使用 inputdetails.Quantity 是因为我想查看该药物的剩余库存数量...属于 Outputdetails 的数量是药物的数量在特定的销售中出售。 请了解如何“接受”和/或“投票”回答您的问题。一旦你得到你的解决方案,不要只是忽略它们。通过“接受”一个答案,您可以告知每个人您已经找到了您的解决方案,并通过点赞您指出哪些答案是有帮助的。 【参考方案1】:

一天的销售额来自您列表中的表 2 和表 3

输出它包含销售 id 和日期

outputdetails 包含在特定销售中销售的药物

但是您没有在这些表中确定足够的列来构建完整的查询。

Select ...
From Output
inner join OutputDetails on OutputDetails.OutputID = Output.ID
Group by ...

您还可以在查询中包含第一个表“drugs”,但我们还不够了解。


在您在下面的第一条评论之后,如果您确实需要将销售和库存信息合并到一个结果中,您需要分别汇总销售额和库存,然后将它们加入到药物表中的常见信息中。 您的问题中的表格没有足够的详细信息,因此以下内容仅供参考。必须有某种方法将药物显式连接到销售数据(即药物和输出之间不能是交叉连接)。

SELECT
      Drugs.ID
    , Drugs.Name
    , r.Stock
    , s.sales
FROM Drugs
LEFT JOIN (
      SELECT
            DrugID
          , SUM(InputDetails.Quantity) AS 'Stock'
      FROM InputDetails
      GROUP BY
            DrugID
      ) r ON Drugs.ID = r.DrugID
LEFT JOIN (
      SELECT
            output.DrugID
          , SUM(OutputDetails.Quantity) AS 'Sales'
      FROM Output
      INNER JOIN OutputDetails ON OutputDetails.OutputID = Output.ID
      GROUP BY
            output.DrugID
      ) o ON Drugs.ID = o.DrugID

【讨论】:

谢谢您的回复...您提供给我的这个查询只适合在一天内带来销售额,这对我来说还不够...我还想将每种药物剩余数量带入表中输入明细中的库存。再次感谢你:) want also to bring each drug remaining quantity in stock 可惜问题中没有说明。 I want to write a query that bring me the sales for today. (就是你说的) 非常感谢...抱歉,这里没有提供有关表格的信息:药物(ID、名称、价格) InputDetails(InputID,DrugID,Expiry,QuantityStock) Output(ID,Date ,Total) OutputDetails(OutputID,DrugID,Price,Quantity) Used_By_Already 你真的帮了我这么多,,,这是我几周前试图写的查询>非常感谢我非常感谢你

以上是关于如何编写从多个表中获取多行数量总和的查询?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用mysql从图像表中获取总数?

如何在从多个表中获取多行的同时删除 sql JOIN 中的重复项

sql从多个表中获取值

如何更新表中的多行

MySQL存储过程从列表中插入多行

如何使用一个 linq 查询获得总数量?