2011-08-03 19 views
1

Je suis en train de créer une procédure stockée pour récupérer la valeur de plusieurs. Le problème est dans le tableau A, il y a un type booléen (isLocked) et je dois créer une colonne pour chaque état (« Locked » et « déverrouillé »). Voici la requête que j'ai écrit:Comment puis-je fusionner 2 lignes dans SQL

SELECT Machine.Machine_ID, 
SUM(FinanceDonnee.CoutHoraire) AS Total, 
CASE 
WHEN FinanceDonnee_isLocked = 1 
THEN 
    SUM(FinanceDonnee.CoutHoraire) 
ELSE 
    0 
END 
AS Locked, 
CASE 
WHEN FinanceDonnee_isLocked= 0 
THEN 
    SUM(FinanceDonnee.CoutHoraire) 
ELSE 
    0 
END 
AS Unlocked 
FROM   ICR INNER JOIN 
      FinanceDonnee ON Machine.Machine_ID = FinanceDonnee.FinanceDonnee_Machine_ID 
GROUP BY ICR_ID, FinanceDonnee.FinanceDonnee_isLocked 

Mais il ne fonctionne pas bien parce que dupliquer le Machine_ID, un pour verrouillé et l'autre pour déverrouillées:

ID   Locked Unlocked 
4D9646EC 0  2 
4D9646EC 12  0 

Je voudrais avoir ce point de vue:

ID   Locked Unlocked 
4D9646EC 12  2 

Comment puis-je le faire?

Merci.

Répondre

7

Il suffit de faire une somme sur verrouillée, déverrouillée comme si:

select sum(locked) as Locked ,sum(unlocked) as Unlocked, ID 
from tablea 
inner join tableb on tablea.ID=tableb.ID 
group by ID 

Utilisation de votre sql, je pense que cela devrait fonctionner:

SELECT machine_id AS id, 
     SUM(locked) AS locked, 
     SUM(unlocked) AS unlocked 
FROM (SELECT machine.machine_id, 
       SUM(financedonnee.couthoraire) AS total, 
       CASE 
       WHEN financedonnee_islocked = 1 THEN SUM(
       financedonnee.couthoraire) 
       ELSE 0 
       END       AS locked, 
       CASE 
       WHEN financedonnee_islocked = 0 THEN SUM(
       financedonnee.couthoraire) 
       ELSE 0 
       END       AS unlocked 
     FROM icr 
       INNER JOIN financedonnee 
       ON machine.machine_id = financedonnee.financedonnee_machine_id 
     GROUP BY icr_id, 
        financedonnee.financedonnee_islocked) t 
GROUP BY t.machine_id 
+0

Merci, cela a fonctionné! J'ai fait comme vous avez suggéré, la seule modification que j'ai faite était de mettre la sous-requête dans une vue. – danny

Questions connexes