2017-05-24 2 views
1

J'ai trois tables comme indiqué ci-dessous.Requête pour joindre trois tables avec une valeur de ligne comme en-tête de colonne

TABLE1 : tb_subject 
subject_id subject_name 
    1   English 
    2   Maths 
    3   Science 

Table2 : tb_student 
subject_id student_id 
    1   AA   
    1   BB 
    2   CC 
    3   DD 
    3   EE 

    Table3 : tb_student_score 
    student_id score conducted_month_number 
     AA   20   2 
     BB   30   3 
     CC   50   4 
     AA   80   4 
     DD   50   6 
     BB   10   2 
     EE   40   3 

Résultat devrait être

conducted_month_number SUM(subject_id1) SUM(subject_id2) SUM(subject_id3) 
     1     0     0     0 
     2     30     0     0 
     3     30     0     40 
     4     80     50     0 
     5     0     0     0 
     6     0     0     60 
     7     0     0     0 
     8     0     0     0 
     9     0     0     0 
     10     0     0     0 
     11     0     0     0 
     12     0     0     0 

Comment écrire une requête de sélection pour cela? Peut-on ajouter tous les numéros de mois qui ne sont pas stockés dans la table comme dans la sortie résultante?

+0

sql server 2005 – user2431727

+0

Avez-vous encore de code? Y a-t-il un nombre connu (fixe) de sujets ou sont-ils variables? –

+0

subject_id1 dans 4. month is not 50 pouvez-vous le vérifier? –

Répondre

3

Vous devriez pouvoir utiliser case when pour résumer pour chaque sujet individuellement:

SELECT conducted_month_number, 
     SUM(CASE b.subject_id WHEN 1 THEN a.score ELSE 0 END) AS English, 
     SUM(CASE b.subject_id WHEN 2 THEN a.score ELSE 0 END) AS Maths, 
     SUM(CASE b.subject_id WHEN 3 THEN a.score ELSE 0 END) AS Science 
FROM tb_student_score AS a 
    JOIN tb_student AS b ON b.student_id = a.student_id 
GROUP BY conducted_month_number 
ORDER BY conducted_month_number; 

Cependant, cela ne suffit pas pour vous assurer d'avoir des résultats pour les valeurs de conducted_month_number qui n'existent pas - si cela est un problème , vous pouvez simplement créer un étudiant fictif avec un score de 0 pour chaque mois. Edit: J'ai remarqué quelques commentaires postés au même moment où j'ai soumis ma réponse - si vous voulez que le nombre de colonnes d'addition soit variable en fonction des valeurs des lignes de la table tb_subject, vous ne trouverez pas le modèle relationnel de SQL pour être bien adapté à cette tâche. Cependant, vous pouvez facilement revenir en arrière et mettre à jour votre requête pour inclure tous les nouveaux sujets que vous pourriez ajouter plus tard.

3

Ont ajouté dummy values de 1 à 12 mois en utilisant union statement et plus tard l'ont fait group by sur eux pour calculer les scores totaux.

Essayez ceci: -

Select conducted_month_number , 
sum(case when subject_id=1 then score else 0 end) as sum_subject_id1, 
sum(case when subject_id=2 then score else 0 end) as sum_subject_id2, 
sum(case when subject_id=3 then score else 0 end) as sum_subject_id3 
from 
(
Select a.conducted_month_number ,subject_id,score 
from 
tb_student_score a 
inner join 
tb_student b 
on a.student_id=b.student_id 
union 
select 1,' ',0 from tb_student_score 
union 
select 2,' ',0 from tb_student_score 
union 
select 3,' ',0 from tb_student_score 
union 
select 4,' ',0 from tb_student_score 
union 
select 5,' ',0 from tb_student_score 
union 
select 6,' ',0 from tb_student_score 
union 
select 7,' ',0 from tb_student_score 
union 
select 8,' ',0 from tb_student_score 
union 
select 9,' ',0 from tb_student_score 
union 
select 10,' ',0 from tb_student_score 
union 
select 11,' ',0 from tb_student_score 
union 
select 12,' ',0 from tb_student_score 
)a 
group by conducted_month_number 

My Output 

conducted_month_number sum_subject_id1 sum_subject_id2 sum_subject_id3 
       1    0    0    0 
       2    30    0    0 
       3    30    0    40 
       4    80    50   0 
       5    0    0    0 
       6    0    0    50 
       7    0    0    0 
       8    0    0    0 
       9    0    0    0 
       10    0    0    0 
       11    0    0    0 
       12    0    0    0