2016-09-15 6 views
0

Это очень конфликт для меня, позвольте мне объяснить, насколько я могу радовать. Это похоже на 2 слоя для вычисления. Первый слой - мне нужно получить общее количество A и общее количество B, общее количество C и общее количество D. Но, чтобы получить общее число A, мне нужно вычислить некоторые столбцы, а также общие B, C и D. Второй слой должен отображать и получать сумму от всех A, B, C, D. Это куча таблиц.MySQL: Получение суммы нескольких столбцов

Для первой таблицы.

tbl_criteria 
------------------------ 
crit_id | criteria_name 
    16 | sports 
    17 | formal 
    18 | talent 
    19 | nothing 

tbl_criteria имеет критерий суб

tbl_sub_criteria 
---------------------- 
sub_crit_id | crit_id | sub_crit_name 
     22  | 16 | originality 
     23  | 16 | audience Impact 
     24  | 18 | Appeal 
     25  | 18 | Stage Presence 

Третий стол судьи.

tbl_judges 
------------------------ 
judge_id | judge_name 
    61  | first 
    62  | second 
    63  | third 

Таблица конкурсанта позволяет говорить 2 конкурсанта

tbl_cotestant 
----------------------------------------------- 
con_id | contestant_number | contestant_name | 
    1 |   1   |  john  | 
    2 |   2   |  sy  | 

Последняя таблица, Это строится таблица

tbl_score 
-------------------------------------------------- 
score_id | crit_id | sub_crit_id | judge_id | con_id | contestant_number | score 
    1  | 16 |  22  |  61 | 1 |  1   |  25 
    2  | 16 |  22  |  61 | 2 |  2   |  25 
    3  | 16 |  22  |  62 | 1 |  1   |  25 
    4  | 16 |  22  |  62 | 2 |  2   |  73 
    5  | 16 |  22  |  63 | 1 |  1   |  70 
    6  | 16 |  22  |  63 | 2 |  2   |  80 
    7  | 16 |  23  |  61 | 1 |  1   |  25 
    8  | 16 |  23  |  61 | 2 |  2   |  25 
    9  | 16 |  23  |  62 | 1 |  1   |  25 
    10 | 16 |  23  |  62 | 2 |  2   |  73 
    11 | 18 |  23  |  63 | 1 |  1   |  70 
    12 | 16 |  23  |  63 | 2 |  2   |  80 
    13 | 18 |  24  |  61 | 1 |  1   |  25 
    14 | 18 |  24  |  61 | 2 |  2   |  25 
    15 | 18 |  24  |  62 | 1 |  1   |  25 
    16 | 18 |  24  |  62 | 2 |  2   |  73 
    17 | 18 |  24  |  63 | 1 |  1   |  70 
    18 | 18 |  24  |  63 | 2 |  2   |  80 
    19 | 18 |  25  |  61 | 1 |  1   |  25 
    20 | 18 |  25  |  61 | 2 |  2   |  25 
    21 | 18 |  25  |  62 | 1 |  1   |  25 
    22 | 18 |  25  |  62 | 2 |  2   |  73 
    23 | 18 |  25  |  63 | 1 |  1   |  70 
    24 | 18 |  25  |  63 | 2 |  2   |  80 
    25 | 17 |  null  |  61 | 1 |  1   |  25 
    26 | 17 |  null  |  61 | 2 |  2   |  25 
    27 | 17 |  null  |  62 | 1 |  1   |  25 
    28 | 17 |  null  |  62 | 2 |  2   |  73 
    29 | 17 |  null  |  63 | 1 |  1   |  70 
    30 | 17 |  null  |  63 | 2 |  2   |  80 
    31 | 19 |  null  |  61 | 1 |  1   |  25 
    32 | 19 |  null  |  61 | 2 |  2   |  25 
    33 | 19 |  null  |  62 | 1 |  1   |  25 
    34 | 19 |  null  |  62 | 2 |  2   |  73 
    35 | 19 |  null  |  63 | 1 |  1   |  70 
    36 | 19 |  null  |  63 | 2 |  2   |  80 

Выход первого слоя являются чем-то вроде этого, получить общее A, B, C, D.

Итого являются должно быть дисплей, как

(criteria 16 has two sub-criterias 22, 23 , that means it will be x2) 
con_num | contestant_name | 16_judge_61 | 16_judge_62 | 16_judge_63 | total a 
    1 |  john  |  50 |  25  |  140  | 215 
    2 |  sy  |  50 |  146  |  160  | 365 

таблица прямо над, Джон получил в общей сложности 215 в Criteria номере 16 (crit_id 16). Так же как sy получил в общей сложности 365 в критериях № 16.

Итак, у меня есть 4 критерия в таблице 16,17,18,19. Это моя проблема, это означает, что мне нужно сделать запрос один за другим, чтобы получить каждый общий объем производства, и это будет как

con_num | contestant_name | 17_judge_61 | 17_judge_62 | 17_judge_63 | total b 
    1 |  john  |  25 |  25  |  70  | 120  
    2 |  sy  |  25 |  73  |  80  | 178 

(criteria 18 has a sub criteria 24,25 that means it will x2) 
con_num | contestant_name | 18_judge_61 | 18_judge_62 | 18_judge_63 | total c 
    1 |  john  |  50 |  50  |  140  | 240  
    2 |  sy  |  50 |  146 |  160  | 356 


con_num | contestant_name | 19_judge_61 | 19_judge_62 | 19_judge_63 | total d 
    1 |  john  |  25 |  25  |  70  | 120  
    2 |  sy  |  25 |  73  |  80  | 178 

мне нужно сделать это в одном запросе, я могу сделать только тогда, когда один за другим получают всего A, B C. Но мне нужен один запрос, который выполняет этот вид вывода. Как я могу достичь этого результата?

total_a, б, в, д эквивалентны crit_id 16, 17, 18, 19

con_num | contestant_name | 16total_a | 17total_b | 18total_c | 19total_d | Grand_total 
    1 |  john  | 215  | 120  | 240  | 120  | 695 
    2 |  jy  | 365  | 178  | 356  | 178  | 1077 

Этот запрос, я все еще учусь о логике

SELECT DISTINCT(a.contestant_number) as con_num, a.contestant_name, 

//Getting first the sum of total a, Notice criteria 16 has a sub criteria 22, 23 
SUM(CASE WHEN s.crit_id='16' AND s.sub_crit_id = 22 AND s.judge_id='61' THEN s.score END) as 16_judge_61, 
SUM(CASE WHEN s.crit_id='16' AND s.sub_crit_id = 22 AND s.judge_id='62' THEN s.score END) as 16_judge_62, 
SUM(CASE WHEN s.crit_id='16' AND s.sub_crit_id = 22 AND s.judge_id='63' THEN s.score END) as 16_judge_63, 

SUM(CASE WHEN s.crit_id='16' AND s.sub_crit_id = 23 AND s.judge_id='61' THEN s.score END) as 16_judge_61, 
SUM(CASE WHEN s.crit_id='16' AND s.sub_crit_id = 23 AND s.judge_id='62' THEN s.score END) as 16_judge_62, 
SUM(CASE WHEN s.crit_id='16' AND s.sub_crit_id = 23 AND s.judge_id='63' THEN s.score END) as 16_judge_63, 

SUM(CASE WHEN s.crit_id='16' AND s.judge_id in (61, 62, 63) THEN s.score END) as 'total a' 

//Criteria 17 has no sub criteria              
SUM(CASE WHEN s.crit_id='17' AND s.judge_id='61' THEN s.score END) as 16_judge_61, 
SUM(CASE WHEN s.crit_id='17' AND s.judge_id='62' THEN s.score END) as 16_judge_62, 
SUM(CASE WHEN s.crit_id='17' AND s.judge_id='63' THEN s.score END) as 16_judge_63, 


SUM(CASE WHEN s.crit_id='17' AND s.judge_id in (61, 62, 63) THEN s.score END) as 'total b'              

//And iterate again for the 2 more criteria 
// 
FROM tbl_score s 
INNER JOIN tbl_contestant a ON s.contestant_number = a.contestant_number 
INNER JOIN tbl_judges j ON j.judge_id = s.judge_id 
WHERE c.gender = 'male' and c.con_id = s.con_id 
GROUP BY s.contestant_number 
ORDER By `Grand toal' DESC";             

http://sqlfiddle.com/#!9/cfe90/1

Получение общей суммы http://sqlfiddle.com/#!9/9efa5/1

+0

'DISTINCT' не является функцией. Он не применяется к одному столбцу, он делает весь список SELECT уникальным. – Barmar

+0

Есть вещи, отсутствующие в вашем SQL. Остальные аргументы 'CONCAT()', 'FROM'. Вы скопировали его правильно? – Barmar

+1

Использование 'GROUP BY s.contestant_number' делает этот столбец разным, вам не нужно использовать' SELECT DISTINCT'. – Barmar

ответ

1

Поместите свой запрос в подзапрос, а затем соедините столбцы, чтобы получить общую сумму.

SELECT x.*, `total a` + `total b` + `total c` AS `Grand Total` 
FROM (put your query here) AS x 
+0

Что дальше после AS x –

+0

Ничего после этого – Barmar

+0

Ничего себе, это работает, я получил общую сумму всех столбцов, но мне нужно установить уникальные столбцы, потому что он говорит, что дублируемое имя столбца можно предотвратить? –

Смежные вопросы