2013-06-10 13 views
7

Ho due tabelle, denominate Table-A e Table-B. Si prega di fare riferimento alle tabelle fornite. Voglio unirmi a questi dopo aver preso l'aggregato della colonna "Valore" in entrambe le tabelle. Per esempio;Join tables with Aggregate value

TABLE-A

 Name Value1 
     ABC  10 
     ABC  18 
     ABC  12 
     DEF  5 
     XYZ  15 
     XYZ  16 

TABELLA B-

 Name Value2 
     ABC  15 
     ABC  5 
     XYZ  9 

mio risultato atteso è,

Risultato

 Name Value1 Value2 
     ABC  40  20 
     DEF  5  0 
     XYZ  31  9 

Spero tu capisca la mia domanda. Qualsiasi aiuto sarà apprezzato.

risposta

6

provare questo -

SELECT 
     a.Name 
    , Value1 = ISNULL(Value1, 0) 
    , Value2 = ISNULL(Value2, 0) 
FROM (
    SELECT 
      Name 
     , Value1 = SUM(Value1) 
    FROM dbo.[TABLE-A] 
    GROUP BY Name 
) a 
LEFT JOIN (
    SELECT 
      Name 
     , Value2 = SUM(Value2) 
    FROM dbo.[TABLE-B] 
    GROUP BY Name 
) b ON a.Name = b.Name 
+0

Hai perso la clausola GroupBy e distinto. Comunque non funzionerà per il mio caso. Potete per favore testare con il campione. –

+0

Sì, ho capito. Grazie. Ma c'è qualche possibilità con solo dichiarazioni di join. Voglio dire, senza usare tabelle temporanee. –

+0

Sì, funziona perfettamente. Grazie. –

1
SELECT [TAB-A].NAME, VALUE1, VALUE2 FROM 
(SELECT NAME, SUM(VALUE1) VALUE1 FROM [TABLE-A] GROUP BY NAME) [TAB-A] LEFT JOIN 
(SELECT NAME, SUM(VALUE2) VALUE2 FROM [TABLE-B] GROUP BY NAME) [TAB-B] 
ON [TAB-A].NAME = [TAB-B].NAME 
+1

+1 per la buona risposta. ma per favore sostituisci nella tua query 'UNISCI' a' SINISTRA UNISCI'. – Devart

1
SELECT 
     COALESCE(A.Name, B.Name) 
    , (CASE WHEN A.value IS NULL THEN 0 ELSE A.value END) AS Value1 
    , (CASE WHEN B.value IS NULL THEN 0 ELSE B.value END) AS Value2 
FROM (
    SELECT Name, SUM(Value) AS Value 
    FROM #A GROUP BY Name 
) AS A 
FULL JOIN (
    SELECT Name, SUM(Value) AS Value 
    FROM #B GROUP BY Name 
) AS B ON A.Name = B.Name 

DROP TABLE #A 
DROP TABLE #B 
+0

Per favore, dimmi il motivo per cui hai abbandonato quei tavoli. Comunque funziona e grazie. –

+0

ho avuto il seguente codice prima: create table #A ( \t nome nvarchar (255) \t, int value ) create table #B ( \t nome nvarchar (255) \t, Valore int ) inserto in #A selezionare 'ABC', 10 uNION ALL selezionare 'ABC', 18 uNION ALL selezionare 'ABC', 12 uNION ALL selezionare 'DEF', 5 inserto int o #B selezionare 'ABC', 15 union tutti selezionare 'ABC', 5 union tutti selezionare 'XYZ', 12 –

+0

Devart & Pavel: deve essere un join esterno completo non lasciato join: perché se si cambiano i dati nel tabella perderà i dati e isnull o coalizione dovrebbe essere applicata a a.name e b.name –