具有相同项目 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 分组问题的主要内容,如果未能解决你的问题,请参考以下文章

SQL 计算具有相同 sub_id 的两个值的百分比。

在 sql (MS-Access) 中编写分组查询

SQL以多种方式对相同数据进行分组

SQL:只选择一行具有相同值的表

如何获取具有相同ID的行的分组信息的列? [复制]

如何获取 SQL 中具有 MAX 和 MIN 值的行的 ID