У меня есть оператор SQL, в котором для каждого WSF_REF выбираются первые 5 строк для каждого ТИПА, а ВЕСЫ суммируются, ГДЕ СТАТУС = «Одобрено». Все остальные строки для ссылки на тип классифицируются как 1. Это работает нормально. Я хочу добавить вторую группу TEAMID.
"SELECT WSF_REF, SUM(WEIGHT)
FROM (SELECT t1.ID, t1.WSF_REF, t1.TYPE, t1.WEIGHT
FROM test t1
LEFT JOIN test t2 ON t2.WSF_REF = t1.WSF_REF AND t2.TYPE = t1.TYPE AND t2.STATUS = t1.STATUS AND t2.ID < t1.ID
WHERE t1.STATUS = 'Approved'
GROUP BY t1.ID, t1.WSF_REF, t1.TYPE, t1.WEIGHT
HAVING COUNT(t2.ID) < 5
UNION ALL
SELECT t1.ID, t1.WSF_REF, t1.TYPE, 1
FROM test t1
LEFT JOIN test t2 ON t2.WSF_REF = t1.WSF_REF AND t2.TYPE = t1.TYPE AND t2.STATUS = t1.STATUS AND t2.ID < t1.ID
WHERE t1.STATUS = 'Approved'
GROUP BY t1.ID, t1.WSF_REF, t1.TYPE
HAVING COUNT(t2.ID) >= 5) t
GROUP BY WSF_REF";
Пример данных
CREATE TABLE test (
`ID` INTEGER,
`WSF_REF` INTEGER,
`TYPE` VARCHAR(4),
`WEIGHT` INTEGER,
`STATUS` VARCHAR(10),
`TEAMID` VARCHAR(10)
);
INSERT INTO test
(`ID`, `WSF_REF`, `TYPE`, `WEIGHT`, `STATUS`, `TEAMID` )
VALUES
('1', '1', 'Pike', '10', 'Approved', 'Red'),
('2', '1', 'Pike', '10', 'Approved', 'Red'),
('3', '1', 'Pike', '10', 'Approved', 'Red'),
('4', '1', 'Pike', '10', 'Approved', 'Red'),
('5', '1', 'Pike', '10', 'Approved', 'Red'),
('6', '1', 'Pike', '10', 'Approved', 'Red'),
('7', '1', 'Asp', '10', 'Approved', 'Red'),
('8', '1', 'Asp', '10', 'Approved', 'Red'),
('9', '1', 'Asp', '10', 'Approved', 'Red'),
('10', '1', 'Asp', '10', 'Approved', 'Red'),
('11', '1', 'Asp', '10', 'Approved', 'Red'),
('12', '1', 'Asp', '10', 'Approved', 'Red'),
('13', '2', 'Pike', '10', 'Approved', 'Red'),
('14', '3', 'Pike', '10', 'Approved', 'Blue');
Предполагаемые результаты
TEAM ID WEIGHT
---------------------
Red 112
Blue 10
Таким образом, WSF_REF по-прежнему используется для обработки начальных итогов, но GROUP BY должен быть TEAMID.
Попробуйте ниже -
SELECT TEAMID,SUM(WEIGHT)
FROM (SELECT t1.ID, t1.WSF_REF, t1.TYPE, t1.WEIGHT,t1.TEAMID
FROM test t1
LEFT JOIN test t2 ON t2.WSF_REF = t1.WSF_REF AND t2.TYPE = t1.TYPE AND t2.STATUS = t1.STATUS AND t2.ID < t1.ID
WHERE t1.STATUS = 'Approved'
GROUP BY t1.ID, t1.WSF_REF, t1.TYPE, t1.WEIGHT,t1.TEAMID
HAVING COUNT(t2.ID) < 5
UNION ALL
SELECT t1.ID, t1.WSF_REF, t1.TYPE, 1,t1.TEAMID
FROM test t1
LEFT JOIN test t2 ON t2.WSF_REF = t1.WSF_REF AND t2.TYPE = t1.TYPE AND t2.STATUS = t1.STATUS AND t2.ID < t1.ID
WHERE t1.STATUS = 'Approved'
GROUP BY t1.ID, t1.WSF_REF, t1.TYPE,t1.TEAMID
HAVING COUNT(t2.ID) >= 5) t
GROUP BY TEAMID
ВЫХОД:
TEAMID weight
Red 112
Blue 10