更改查询以对数据求和或聚合
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;
我有一个 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;