У меня сложный SQL-запрос, в котором мне требуется СУММА первых 5 весовых строк на тип для каждой ссылки. У меня это отсортировано в коде ниже. Следующим шагом является обработка всех других весов для каждой ссылки за пределами первых 5 как значения 1 и добавление к Total_Weight.
Таким образом, если итоговая сумма SUM 'первых 5' равна 20 для этой ссылки, и для этой ссылки есть еще 10 строк (весов), Total_Weight для этой ссылки будет 30 независимо от фактических значений веса.
SELECT B.wsf_ref,
SUM(T_wsf_value) Total_wsf_value,
group_concat(concat('TOP 5 ',B.type,' (',B.T,')') SEPARATOR ' ') Details
FROM
(
SELECT id, wsf_ref, status, type, SUM(wsf_value) T_wsf_value,group_concat(wsf_value SEPARATOR '+') T
FROM
(
SELECT * FROM
(
SELECT id, wsf_ref, type, status, CASE WHEN @wsf_ref = wsf_ref THEN @ROW_NUMBER := @ROW_NUMBER + 1 ELSE @ROW_NUMBER := 1 END AS rn,wsf_value,@wsf_ref := wsf_ref
FROM individual,(SELECT @ROW_NUMBER := 1, @wsf_ref := ''
) r
WHERE type= 'Pike' AND status= 'Approved' ORDER BY wsf_ref, id ASC
)A WHERE rn < 6
UNION ALL
SELECT * FROM
(
SELECT id, wsf_ref, type, status, CASE WHEN @wsf_ref = wsf_ref THEN @ROW_NUMBER := @ROW_NUMBER + 1 ELSE @ROW_NUMBER := 1 END AS rn,wsf_value,@wsf_ref := wsf_ref
FROM individual,(SELECT @ROW_NUMBER := 1, @wsf_ref := ''
) r
WHERE type= 'Zander' AND status= 'Approved' ORDER BY wsf_ref, id ASC
)A WHERE rn < 6
UNION ALL
SELECT * FROM
(
SELECT id, wsf_ref, type, status, CASE WHEN @wsf_ref = wsf_ref THEN @ROW_NUMBER := @ROW_NUMBER + 1 ELSE @ROW_NUMBER := 1 END AS rn,wsf_value,@wsf_ref := wsf_ref
FROM individual,(SELECT @ROW_NUMBER := 1, @wsf_ref := ''
) r
WHERE type= 'Asp' AND status= 'Approved' ORDER BY wsf_ref, id ASC
)A WHERE rn < 6
UNION ALL
SELECT * FROM
(
SELECT id, wsf_ref, type, status, CASE WHEN @wsf_ref = wsf_ref THEN @ROW_NUMBER := @ROW_NUMBER + 1 ELSE @ROW_NUMBER := 1 END AS rn,wsf_value,@wsf_ref := wsf_ref
FROM individual,(SELECT @ROW_NUMBER := 1, @wsf_ref := ''
) r
WHERE type= 'Chub' AND status= 'Approved' ORDER BY wsf_ref, id ASC
)A WHERE rn < 6
UNION ALL
SELECT * FROM
(
SELECT id, wsf_ref, type, status, CASE WHEN @wsf_ref = wsf_ref THEN @ROW_NUMBER := @ROW_NUMBER + 1 ELSE @ROW_NUMBER := 1 END AS rn,wsf_value,@wsf_ref := wsf_ref
FROM individual,(SELECT @ROW_NUMBER := 1, @wsf_ref := ''
) r
WHERE type= 'Perch' AND status= 'Approved' ORDER BY wsf_ref, id ASC
)A WHERE rn < 6
)A
GROUP BY wsf_ref, type
)B
GROUP BY wsf_ref
ORDER BY Total_wsf_value DESC
Могу ли я сделать это в текущей структуре?
Sample Data
ID WSF_REF TYPE WEIGHT
-----------------------------------
1 1 Pike 10 *
2 1 Pike 10 *
3 1 Pike 10 *
4 1 Pike 10 *
5 1 Pike 10 *
6 1 Pike 10 Treated as value 1.
7 1 Asp 10 *
8 1 Asp 10 *
9 1 Asp 10 *
10 1 Asp 10 *
11 1 Asp 10 *
12 1 Asp 10 Treated as value 1.
13 2 Pike 10 *
Результаты будут следующими:
WSF_REF Total_Weight
-------------------------
1 102
2 10