2009-06-26 5 views
2

j'ai 3 tables3 jointures et clause where ensemble

bl_main (bl_id UNIQUE, bl_area) 
bl_details (bl_id UNIQUE, name) 
bl_data(bl_id, month, paper_tons, bottles_tons) 

bl_id est pas unique dans la dernière table. Il y aura plusieurs lignes de même bl_id.

Je suis en train de récupérer des données de la manière suivante

bl_id | name | bl_area | sum(paper_tons) | sum (bottles_tons) | paper_tons | bottles_tons 

sum(paper_tons) doit retourner la somme de toutes les tonnes de papier pour la même bl_id comme Jan à Décembre. En utilisant la requête ci-dessous je suis capable de récupérer toutes les données correctement, sauf dans le résultat, il y a plusieurs occurrences de bl_ids(From bl_data table).

SELECT bl_main.bl_id,name,bl_area,sums.SummedPaper, sums.SummedBottles,paper_tons,bottles_tons 
FROM bl_main 
JOIN bl_details ON 
    bl_main.bl_id= bl_details.bl_id 
left outer JOIN bl_data ON 
    bl_data.bl_id= bl_main.bl_id 
left outer JOIN (
    SELECT bl_id, SUM(Paper_tons) As SummedPaper, SUM(bottle_tons) As SummedBottles 
FROM bl_data 

GROUP par bl_id) résume ON sums.bl_id = bl_main.bl_id

Je WANTO récupérer uniquement les valeurs uniques de bl_ids sans répétition et il doit contenir le bl_id qui a le mois maximum et pas tous les mois pour le même bl_id.

Ex:

INCORRECT 


**0601** University Hall  75.76 17051 1356 4040 1154 **11**  
**0601** University Hall  75.76 17051 1356 9190 101  **12** 
**0605** UIC Student  22.86 3331 14799 0 356 **8** 

CORRECT 
**0601** University Hall  75.76 17051 1356 9190 101  **12** 
**0605** UIC Student  22.86 3331 14799 0 356 **8** 

Je sais que je peux obtenir la valeur maximale en utilisant

WHERE Month = (SELECT MAX(Month) 

mais où exactlt devrais-je ajouter ceci dans la requête et dois-je changer la jointure définition. Toute aide est très appréciée car je suis nouveau à sql. Merci d'avance.

+0

Relisez votre message et obtenez votre droite bl_id et bu_ids. –

+0

Quels SGBDR utilisez-vous? – Quassnoi

+0

Basé sur le fait qu'il écrit des requêtes brutes, je ne pense pas qu'il utilise RDBMS – marr75

Répondre

0

Vous pouvez vous joindre à la table contenant le mois contre lui-même, en utilisant une sous-requête de la forme:

Select * 
From mytable m 
    Inner Join (Select max(Month) as Month, myId 
       From mytable 
       Group By myId) mnth 
     On mnth.myId = m.myId and mnth.Month = m.Month 
0

Votre clause JOIN

left outer JOIN bl_data ON 
    bl_data.bl_id= bl_main.bl_id 

ne précise pas quel mois pour sélectionner les données que vous affichent avec paper_tons et bottles_tons.

Vous pouvez mettre à jour que JOIN pour ne contenir le mois maximum, et cela devrait limiter les entrées, comme ceci:

left outer JOIN (SELECT bl_id, MAX(Month) as Month from bl_data GROUP BY bl_id) as Month 
    ON Month.bl_id = bl_main.bl_id 
left outer JOIN bl_data ON 
    bl_data.bl_id = bl_main.bl_id AND bl_data.Month = Month.bl_Month 
0

Je pense que cette question est ce que vous cherchez

SELECT bl_main.bl_id,name, bl_area, sums.SummedPaper, sums.SummedBottles, paper_tons, bottles_tons 
FROM bl_main 
    JOIN bl_details ON bl_main.bl_id= bl_details.bl_id 
    left outer JOIN bl_data ON bl_data.bl_id= bl_main.bl_id 
    left outer JOIN 
    (
     SELECT bl_id, month, SUM(Paper_tons) As SummedPaper, SUM(bottle_tons) As SummedBottles 
     FROM bl_data 
     WHERE month in 
     (SELECT MAX(month) FROM bl_data GROUP BY bl_id) 
     GROUP BY bl_id, month 
    ) sums ON sums.bl_id = bl_main.bl_id 
+0

Cela ne donne pas la somme correctement ni l'unique bl_ids. –

1

Vous avez probablement deux tables qui devraient être combinées en une (bl_main et bl_details). Mais mis à part cela, ce dont vous avez besoin est une sous-requête d'auto-jointure pour sélectionner la ligne avec le mois maximum. Quelque chose comme ce qui suit (non testé):

SELECT bl_main.bl_id, bl_details.name, bl_main.bl_area, sums.sum_paper_tons, 
     sums.sum_bottles_tons, maxmonth.paper_tons, maxmonth.bottles_tons 
FROM bl_main 
INNER JOIN bl_details ON bl_main.bl_id = bl_details.bl_id 
LEFT OUTER JOIN (SELECT bl_id, SUM(paper_tons) AS sum_paper_tons, 
         SUM(bottles_tons) AS sum_bottles_tons 
       FROM bl_data 
       GROUP BY bl_id) sums ON bl_main.bl_id = sums.bl_id 
LEFT OUTER JOIN (SELECT bl_id, paper_tons, bottles_tons 
       FROM bl_data data2 
       INNER JOIN (SELECT bl_id, MAX(month) AS max_month 
          FROM bl_data 
          GROUP BY bl_id) m 
        ON m.bl_id = data2.bl_id 
        AND m.max_month = data2.month) maxmonth 
    ON bl_main.bl_id = maxmonth.bl_id 
+0

Merci Ic. J'essaye vraiment dur mais je suis incapable d'exécuter la requête. Il donne une erreur - "colonne ambiguë définie". Toute aide est appréciée. –

+0

Les alias de colonne ayant le même nom que la colonne qu'ils regroupent peuvent-ils être compris? Je pensais que cela pourrait différencier, mais peut-être pas ... –

+0

non. Dint aide. Il donne toujours l'erreur "colonne ambiguë définie". Merci encore pour votre temps. Que pensez-vous que pourrait avoir tort? –

Questions connexes