2017-10-24 12 views
1

私は4つのテーブルからなるテーブルを得ようとしています:clientsgroups_clientsclient_data1client_data2;サブクエリSQLを使用して4つのテーブルを結合する方法は?

クライアント

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 | 

望ましいテーブルは、クエリがtable_data1から採取されたすべての行を合計し、日付がsome dategroup name

によってグループにあるtable_data2を取らなければならないこの

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

ようにする必要がありますここに私のコードです:

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 

しかし結果はちょっとひどいです。私はgroupnameでグループ化していないようです。だから...私はあなたの助けが必要です。何か案は?私はそれを正しく照会するために何をすべきですか?前もって感謝します!

答えて

0

あなたはgroup_clientテーブルから開始しようとしましたか?クライアントに参加してからtable_data1とtable_data2 ..に参加してから、必要な列を集約しましたか?

ので、クエリは、合計をグループに事前にして、ダブルカウントの行を避けるために参加する必要があり、この

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

いいえ、でも試してみます –

+0

これは機能しますが、カウントされた数値は大きすぎます。それは円のループに入り、何度も同じ値を合計するように見えます。どうすればこれを防ぐことができますか? – ex1t3

+0

@ハリー、このクエリは、デカルト積として知られているものの下落しています。 'GROUP BY'節を使わずにクエリを実行し、何が起こっているのかを知ることができるかどうか確認してください。 –

1

ような何かを行くだろう。

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

しかし、グループ名はどうですか?あなたのコードを使ってどこでグループ化するのですか? – ex1t3

+0

がグループを含むように更新されました – indiri

+0

サブクエリで無効な列名に関する多くのエラーが発生しました – ex1t3

関連する問題