具有相同项目ID的SQL Group By Issue

时间:2014-10-16 23:48:15

标签: sql postgresql

我正在尝试跟踪代表的销售总数以及他上班的时间。

我有以下两个表:

表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分钟,无论他卖多少物品。

有什么建议吗?

2 个答案:

答案 0 :(得分:3)

如果您希望按原样使用样本数据,则需要提取班次并总结分钟,如下所示:

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

但是,使用现有表格,select语句会更容易:

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

答案 1 :(得分:1)

我认为这个查询应该做你想做的事情:

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