更改查询以对数据求和或聚合

Change query to sum or aggregate data

我有一个 SQL 查询运行良好,但我现在需要对其进行更改以汇总数据,但我不确定该怎么做 -

SELECT store, tintermodel, tinterserial, eventdetails, trunc(datetime), COUNT(*)
FROM tinter_events
WHERE tintermodel = 'FM 8000DE'  
AND (datetime >= to_timestamp('2017-05-01', 'YYYY-MM-DD') 
AND datetime < to_timestamp('2017-08-31', 'YYYY-MM-DD'))
AND function = 'Set Colorant Level'
AND eventdetails IN ('R3[128]', 'G2[128]', 'W1[345]', 'Y3[512]', 'N1[185]', 
'R4[128]', 'L1[128]', 'B1[550]', 'B1[512]', 'Y1[128]', 'R2[185]')
GROUP BY store, tintermodel, tinterserial, eventdetails, trunc(datetime) 
HAVING COUNT(*) > 1
ORDER BY store, tinterserial, eventdetails, trunc(datetime);

它的作用是让我计算特定型号(按序列号)在一天内多次被填充 ("set colorant level") 的任何日期。这为我显示了发生这种情况的每个日期。

但现在我需要按商店对每种着色剂的总量进行汇总(又名 SUBSTR(eventdetails,1,2))。换句话说,左边有一个商店列表,每种着色剂都有一列,每种着色剂被填充不止一次的总 天数。

我不确定如何处理这个问题,因为我已经得到了一个计数,只会给我在特定 model/serial 上每天填充着色剂超过一次的情况。也许是某种 SUM/SUMIF?还是分select?

获取基础数据为:

SELECT store, SUBSTR(eventdetails, 1, 2) as colorant, COUNT(*) as numdays
FROM (SELECT store, tintermodel, tinterserial, eventdetails, trunc(datetime), COUNT(*)
      FROM tinter_events
      WHERE tintermodel = 'FM 8000DE' AND 
            datetime >= to_timestamp('2017-05-01', 'YYYY-MM-DD') AND
            datetime < to_timestamp('2017-08-31', 'YYYY-MM-DD') AND
            function = 'Set Colorant Level' AND
            eventdetails IN ('R3[128]', 'G2[128]', 'W1[345]', 'Y3[512]', 'N1[185]', 
'R4[128]', 'L1[128]', 'B1[550]', 'B1[512]', 'Y1[128]', 'R2[185]')
      GROUP BY store, tintermodel, tinterserial, eventdetails, trunc(datetime) 
      HAVING COUNT(*) > 1
     ) t
GROUP BY store, SUBSTR(eventdetails, 1, 2);

这会生成您想要的数据,但分为三列。您可以使用条件聚合来转换它:

SELECT store,
       SUM(CASE WHEN SUBSTR(eventdetails, 1, 2) = 'R3' THEN 1 ELSE 0 END) as R3,
       SUM(CASE WHEN SUBSTR(eventdetails, 1, 2) = 'G2' THEN 1 ELSE 0 END) as G2,
       SUM(CASE WHEN SUBSTR(eventdetails, 1, 2) = 'W1' THEN 1 ELSE 0 END) as W1,
       . . .
FROM (SELECT store, tintermodel, tinterserial, eventdetails, trunc(datetime), COUNT(*)
      FROM tinter_events
      WHERE tintermodel = 'FM 8000DE' AND 
            datetime >= to_timestamp('2017-05-01', 'YYYY-MM-DD') AND
            datetime < to_timestamp('2017-08-31', 'YYYY-MM-DD') AND
            function = 'Set Colorant Level' AND
            eventdetails IN ('R3[128]', 'G2[128]', 'W1[345]', 'Y3[512]', 'N1[185]', 
'R4[128]', 'L1[128]', 'B1[550]', 'B1[512]', 'Y1[128]', 'R2[185]')
      GROUP BY store, tintermodel, tinterserial, eventdetails, trunc(datetime) 
      HAVING COUNT(*) > 1
     ) t
GROUP BY store;