2017-10-24 2 views
1

Ich versuche, eine Tabelle zu erhalten, die aus 4 Tabellen besteht: clients, groups_clients, client_data1, client_data2;Wie 4 Tabellen mit SQL-Unterabfrage kombinieren?

Kunden

clId| GroupId | Other | 
------------------------ 
1 | 1  | gddgdg| 
2 | 1  | dgdg | 
3 | 2  | ddg | 
4 | 2  | dd4g | 
5 | 1  | ddg | 

groups_clients

grId | GroupName| 
----------------- 
    1 | Group1 | 
    2 | Group2 | 

table_data1

clId | Date  | Buy | Trade | 
    -------------------------------- 
    1 | 2017-06-05 | 3 | 4  | 
    2 | 2017-11-10 | 6 | 9  | 
    2 | 2017-11-11 | 4 | 13 | 
    2 | 2017-03-01 | 11 | 0  | 
    4 | 2017-01-10 | 3 | 11 | 

table_data2

clId | Date  | With | Depos | 
    -------------------------------- 
    1 | 2017-03-05 | 1 | 3  | 
    5 | 2017-08-10 | 0 | 8  | 
    2 | 2017-11-11 | 0 | 13 | 
    3 | 2017-03-01 | 11 | 0  | 
    4 | 2017-01-10 | 3 | 11 | 

Die wünschenswerte Tabelle wie diese

GroupName | SUM(Buy) | SUM(Trade) | SUM(With) | SUM(Depos) | 
------------------------------------------------------------ 
    Group1 | 13  | 26   | 1   | 24   | 
    Group2 | 3  | 11   | 14  | 11   | 

sollte die Abfrage alle Zeilen aus table_data1 und genommen table_data2 genommen Summe sollte in dem Datum some date und Gruppe ist es von group name

Hier ist mein Code:

SELECT 
    groups_clients.GroupName as group_name, 
    clients.GroupId AS groupid, 
    SUM(table_data1.buy) AS buy, 
    SUM(table_data1.trade) AS trade, 
    with, 
    depos 
FROM 
    table_data1 
INNER JOIN 
    (SELECT 
     SUM(table_data2.with) AS with, 
     clients.clId, GroupId 
    FROM 
     clients 
    LEFT JOIN 
     table_data2 ON clients.clId = table_data2.clId 
        AND table_data2.date <= '11-11-2016' 
    GROUP BY 
     GroupId, clId) clients ON table_data1.clId = clients.clId 
LEFT JOIN 
    groups_clients ON groups_clients.Id = clients.GroupId 
WHERE 
    table_data1.date <= '11-11-2016' 
GROUP BY 
    clients.GroupId, With, Depos, 
    groups_clients.GroupName 

Aber das Ergebnis ist irgendwie schrecklich. Es gibt viele gleiche Gruppen hintereinander aus, scheint nicht von groupname gruppiert worden zu sein. Also ... ich brauche deine Hilfe, Leute. Irgendwelche Ideen? Was soll ich tun, damit die Abfrage richtig funktioniert? Danke im Voraus!

Antwort

0

Haben Sie versucht aus der group_client Tabelle zu starten .. Join zu Clients und dann zu Table_data1 und Table_data2 .. und dann aggregieren Sie die Spalten, die Sie wollen?

Also die Abfrage würde so etwas wie dieses

declare @date date = '2017-06-05' 

select 

gc.groupname 
,sum(td1.buy) as total_buy 
,sum(td1.Trade) as total_trade 
,sum(td2.with) as total_with 
,sum(td2.Depos) as total_depos 

from groups_client gc 

    inner join clients c 
     on c.groupid = gc.grid 

    inner join table_data1 td1 
     on td1.clid = c.clid 
     and td1.Date = @date 

    inner join table_data2 td2 
     on td2.clid = c.clid 
     and td2.Date = @date 

     group by 

     gc.groupname 
+0

Nein, aber ich werde versuchen –

+0

Es funktioniert, aber die gezählten Zahlen sind zu groß. Sieht aus wie es in einer Kreisschleife geht und summiert oft die gleichen Werte. Wie kann ich das verhindern? – ex1t3

+0

@Harry, diese Abfrage fällt in Konflikt mit dem, was als kartesisches Produkt bekannt ist. Führen Sie die Abfrage ohne die GROUP BY -Klausel aus und sehen Sie, ob Sie erkennen können, was falsch läuft. –

1

Sie müssen Vorgruppenlage die Summen gehen und dann eine Doppelzählung Reihen zu vermeiden beitreten.

DECLARE @mydate DATETIME 
SELECT @mydate='11/11/2017' 

SELECT gc.GroupName, 
     isnull(SUM([Buy]), 0) [Buy], 
     isnull(SUM([Trade]), 0) [Trade], 
     isnull(SUM([With]), 0) [With], 
     isnull(SUM([Depos]), 0) [Depos] 
FROM groups_clients gc 
    INNER JOIN clients c ON gc.grId=c.GroupId 
    LEFT JOIN (SELECT clId, SUM([Buy]) [Buy], SUM([Trade])[Trade] 
     FROM table_data1 WHERE [Date][email protected] GROUP BY clId) a ON c.clId=a.clId 
    LEFT JOIN (SELECT clId, SUM([With]) [With], SUM([Depos])[Depos] 
     FROM table_data2 WHERE [Date][email protected] GROUP BY clId) b ON c.clId=b.clId 
GROUP BY gc.GroupName 
+0

Aber was ist mit einem Gruppennamen? Wo sollte ich es mit Ihrem Code gruppieren, Ma'am? – ex1t3

+0

aktualisiert, um die Gruppe – indiri

+0

Ich fing viele Fehler über ungültige Spaltennamen in Unterabfragen – ex1t3