Гордон избил меня до ответа.Это можно сделать с помощью стандартного SQL.
SQL Fiddle
Настройка схемы MySQL 5.6 :
CREATE TABLE t1 (a int, b int, c int, d int) ;
INSERT INTO t1 (a,b,c,d)
SELECT 1,1,0,10 UNION ALL
SELECT 1,1,0,10 UNION ALL
SELECT 1,1,0,20 UNION ALL
SELECT 1,1,0,20 UNION ALL
SELECT 1,1,1,10 UNION ALL
SELECT 1,1,1,20 UNION ALL
SELECT 1,1,2,10 UNION ALL
SELECT 1,1,2,30 UNION ALL
SELECT 1,1,3,10 UNION ALL
SELECT 1,1,5,10 UNION ALL
SELECT 1,1,12,10 UNION ALL
SELECT 1,1,5,10 UNION ALL
SELECT 1,1,5,10 UNION ALL
SELECT 1,1,5,20 UNION ALL
SELECT 1,1,5,20
Запрос 1 :
SELECT d
, sum(CASE WHEN c IN (0,12) THEN a ELSE 0 END) AS x1
, sum(CASE WHEN c IN (0,12) THEN b ELSE 0 END) AS x2
, sum(CASE WHEN c = 2 THEN a ELSE 0 END) AS x3
, sum(CASE WHEN c = 2 THEN b ELSE 0 END) AS x4
, sum(CASE WHEN c = 1 THEN a ELSE 0 END) AS x5
, sum(CASE WHEN c = 1 THEN b ELSE 0 END) AS x6
FROM t1
WHERE c IN (0,1,2,12)
GROUP BY d
Результаты :
| d | x1 | x2 | x3 | x4 | x5 | x6 |
|----|----|----|----|----|----|----|
| 10 | 3 | 3 | 1 | 1 | 1 | 1 |
| 20 | 2 | 2 | 0 | 0 | 1 | 1 |
| 30 | 0 | 0 | 1 | 1 | 0 | 0 |
Если в c
имеется много значений, которых нет в 0,1,2,12
затем вы можете использовать WHERE
, чтобы сократить результирующий набор, который вы будете агрегировать.В противном случае, вы можете удалить его.