具有相同项目 ID 的 SQL 分组问题
Posted
技术标签:
【中文标题】具有相同项目 ID 的 SQL 分组问题【英文标题】:SQL Group By Issue with same item ID 【发布时间】:2014-10-16 23:48:14 【问题描述】:我正在尝试跟踪销售代表的总销售额以及他上班的时间。
我有以下两张表:
表1:
employeeID | item | price | timeID
----------------------------------------
1 | 1 | 12.92 | 123
1 | 2 | 10.00 | 123
1 | 2 | 10.00 | 456
表2:
ID | minutes_in_shift
--------------------------
123 | 45
456 | 15
我将使用以下 SQL 连接这两个查询:
SELECT
t1.employeeID, t1.item, t1.price, t1.shiftID, t2.minutes_in_shift
FROM table1 t1
JOIN table 2 t2 ON (t2.ID = t1.timeID)
这将返回下表:
employeeID | item | price | timeID | minutes_in_shift
---------------------------------------------------
1 | 1 | 12.92 | 123 | 45
1 | 2 | 10.00 | 123 | 45
1 | 2 | 10.00 | 456 | 15
但是,我希望合并结果有这样的结果:
employeeID | itemsSold | priceTotals | totaltimeworked
-----------------------------------------------------------------
1 | 3 | 32.92 | 60
我可以将 COUNT 和 SUM 用于项目和价格,但我无法弄清楚如何以上面显示的方式正确显示总工作时间。 注意:我只是在计算工作时间时遇到了麻烦。在 123 班 - 员工 1 工作 45 分钟,不管他卖了多少物品。
有什么建议吗?
【问题讨论】:
对于 itemsSold 和 priceTotals 使用select employeeID, count(*), sum(price) group by employeeID
。你如何计算总工时?
cha - items 表是一个,它连接到一个显示存储时间量的工作时间表。这是字面时间(123 班他上 45 分钟,456 班,他上 15 分钟,不管售出的物品如何)
从您的样本中可以实现。但是,如果您可以向我们展示用于构建示例的源 SQL,我们可能会对其进行优化以立即获得所需的结果
@cha - 重新设计的问题
【参考方案1】:
如果您希望按原样使用样本数据,则需要提取班次并对分钟求和,如下所示:
with a as (
select employeeID, count(*) itemsSold, sum(price) priceTotals
from Sampletable1
group by employeeID),
b as (
select employeeID, shiftID, max(minutes_in_shift) minutes_in_shift
from Sampletable1
group by employeeID, shiftID),
c as (
select employeeID, sum(minutes_in_shift) totaltimeworked
from b
group by employeeID)
select a.employeeID, a.itemsSold, a.priceTotals, c.totaltimeworked
from a inner join c on a.employeeID = c.employeeID
但是,对于您现有的表,选择语句会容易得多:
with a as (
select employeeID, timeID, count(*) itemsSold, sum(price) priceTotals
from table1
group by employeeID, timeID)
select a.employeeID, sum(a.itemsSold), sum(a.priceTotals), sum(table2.minutes_in_shift) totaltimeworked
from a inner join table2 on a.timeID = table2.ID
group by a.employeeID
【讨论】:
【参考方案2】:我认为这个查询应该做你想做的事:
SELECT t1.employeeID,
count(t1.item) AS itemsSold,
sum(t1.price) AS priceTotals,
sum(DISTINCT t2.minutes_in_shift) AS totaltimeworked
FROM table1 t1
JOIN table2 t2 ON (t2.ID = t1.timeID)
GROUP BY t1.employeeID;
Check on SQL Fiddle
【讨论】:
这实际上可能是一个更快、更准确的查询,因为分钟永远不会改变相同的 shiftID。谢谢@vyegorov 请谨慎使用此查询。如果您有相同分钟数的不同班次,则查询会将它们计为一次并产生错误的结果以上是关于具有相同项目 ID 的 SQL 分组问题的主要内容,如果未能解决你的问题,请参考以下文章