2017-01-04 4 views
0

Ich bin ziemlich neu bei SQL! Ich habe zwei Querys aus verschiedenen Tabellen. Dies ist meine erste Abfrage:SQL: Merge zwei verschiedene Abfrage

SELECT cli.CLIENTE as clientet,cli.RAZON as nom, 
     SUM(distinct par.[RECAPTACIO]*0.9) AS recaudacionSINIVA, 
     SUM(distinct par.canvi) as cambiocargado, 
     SUM(distinct par.consum) as CC_recaptacio,count(distinct par.DATA) as visita, 
     SUM((c.quantitat + c.caixes * c.uxcaja) * c.pvp) as CC_Caducados 

FROM [V30].[dbo].[parmaq] as par,[V30].[dbo].[clientes] as cli , V30.dbo.parcons as c 
    where cli.CLIENTE=par.EMPRESA and par.enllas=c.enllas 
    and par.data > '13-11-2015' and par.data < '20-11-2015' 
    group by cli.CLIENTE,cli.RAZON 

Und das ist das Ergebnis: enter image description here

Dies ist meine zweite Abfrage:

SELECT cli.cliente as clientet, cli.RAZON, SUM(distinct m1.IMPORTE) as FACTURACION, 
     SUM(distinct m2.coste * m2.canti) as CC_facturacio 
FROM [V30].[dbo].[clientes] as cli, [V30].[dbo].[MESTA1] as m1,V30.dbo.MESTA2 as m2 
     where m2.albaran=m1.albaran and m1.CLIENTE=cli.CLIENTE 
     and m1.FECHA > '13-11-2015' and m1.FECHA < '30-11-2015' 
     group by cli.CLIENTE,cli.razon order by cli.cliente 

Und das Ergebnis der zweiten Abfrage: enter image description here

Auf dem SQL gibt es keine Möglichkeit, die Tabellen mit Prim zu verknüpfen Schlüssel! und die Ergebnisse aus den Fragen eins und zwei sind in Ordnung. Was ich tun möchte, ist die Kombination der Ergebnisse mit der Spalte "clientet". Ich muss sagen, dass Sie eine unterschiedliche Anzahl von Zeilen erhalten können.

Ziel ist es, alle diese Informationen auf das gleiche Ergebnis zu haben. Wenn zum Beispiel "clientet" Ergebnisse für beide Querys enthält, sollte das Endergebnis alle Spalten aus der ersten Abfrage + "FACTURACION" und "CC_facturacio" aus der zweiten Abfrage sein.

Hoffe, du kannst mir helfen, ich habe Inner Joins und Unterfragen versucht, aber es gibt keine Möglichkeit, das zu bekommen.

+0

UNION ALL? (Einige NULL-Spalten in der zweiten Abfrage benötigt.) – jarlh

+0

Wird es als Ergebnis beider Abfragen denselben Client (dieselbe ID) geben? Ist es beispielsweise möglich, dass in den Ergebnissen beider Abfragen ein Client mit clientit 101500 erscheint? –

+0

** Randnotiz: ** Beenden Sie die Verwendung von Joins im alten Stil. Explizite Joins sind seit über 20 Jahren Teil von ANSI-SQL. –

Antwort

1

zwei Optionen:

  1. Als jarlh vorgeschlagen, man konnte so lange eine Vereinigung tun, wie Sie für die fehlenden Spalten in jeder Abfrage Platzhalter setzen, die nicht existieren und sicherstellen, dass sie in der gleichen Auftrag.

  2. Sie könnten eine vollständige äußere Verknüpfung Ihrer zwei Abfragen durchführen. Je nachdem, ob Nullen für Spalten angezeigt werden sollen, wenn in beiden Tabellen keine Zeile vorhanden ist, möchten Sie möglicherweise eine Koaleszenz zu jeder anderen Spalte hinzufügen.

Das folgende Beispiel geht davon clientet die Joinspalte ist:

SELECT COALESCE(TBL_1.clientet, TBL_2.clientet) as clientet 
    , TBL_1.nom 
    , TBL_1.recaudacionSINIVA 
    , TBL_1.cambiocargado 
    , TBL_1.CC_recaptacio 
    , TBL_1.visita 
    , TBL_1.CC_Caducados 
    , TBL_2.FACTURACION 
    , TBL_2.CC_facturacio 
FROM 

     (SELECT cli.CLIENTE as clientet 
      , cli.RAZON as nom 
      , SUM(distinct par.[RECAPTACIO]*0.9) AS recaudacionSINIVA 
      , SUM(distinct par.canvi) as cambiocargado 
      , SUM(distinct par.consum) as CC_recaptacio 
      , count(distinct par.DATA) as visita 
      , SUM((c.quantitat + c.caixes * c.uxcaja) * c.pvp) as CC_Caducados  
     FROM [V30].[dbo].[parmaq] as par,[V30].[dbo].[clientes] as cli , V30.dbo.parcons as c 
      where cli.CLIENTE=par.EMPRESA and par.enllas=c.enllas 
      and par.data > '13-11-2015' and par.data < '20-11-2015' 
      group by cli.CLIENTE,cli.RAZON) TBL_1 

FULL OUTER JOIN 

     (SELECT cli.cliente as clientet 
      , cli.RAZON 
      , SUM(distinct m1.IMPORTE) as FACTURACION 
      , SUM(distinct m2.coste * m2.canti) as CC_facturacio 
     FROM [V30].[dbo].[clientes] as cli, [V30].[dbo].[MESTA1] as m1,V30.dbo.MESTA2 as m2 
      where m2.albaran=m1.albaran and m1.CLIENTE=cli.CLIENTE 
      and m1.FECHA > '13-11-2015' and m1.FECHA < '30-11-2015' 
      group by cli.CLIENTE,cli.razon) TBL_2 

    ON TBL_1.clientet = TBL_2.clientet 
ORDER BY COALESCE(TBL_1.clientet, TBL_2.clientet) 
+0

Das funktioniert völlig, musste nur Paste kopieren! Ich danke dir sehr! – talendguy