2017-08-01 7 views
-3

は、グループバイおよび右外側結合を組み合わせる必要があります。右外側結合によるグループ化

テーブルAには "A"、 "B"、 "C"、 "D" の基を有する

テーブルB有する:12 | 2 | B 1 | 5 | B 3 | Dを数回。

このようなグループによるビューとしてIグループテーブルB:

ViewB:13 | 7 | B 3 | D

あなたが見ることができるように、グループ "C" でありますTableBではなく、ViewBではなく。

cをどのように私はそれをachiveすることができます| 7 | | B 3 | Dヌル

ViewB 13:私はいくつかの外側には、次のように参加する必要がありますか?

UPDATE。 この単純な例では複雑さについては説明していません。 私は3番目のテーブル "ユーザ"を持っています 各ユーザごとに、各TableA-Valuesのためにグループ化してください。 例

userA| 13| a 
userA| 7 | b 
userA| 3 | d 
userB| 10| a 
userB| 70 | b 
userB| 30 | d 

グループ "c" はTableBのではありません(TableBのは、グループの値が含まれています) 私はこのようなクエリしてみてください:

select 
right outer join TableA 
on TableB.id = TableA.id 
join TableC 
on TableB.other_id = TableC.other_id 
group by TableB.groups 

を私はちょうどこのような何かを得ます

null| null| c 
userA| 13| a 
userA| 7 | b 
userA| 3 | d 
userB| 10| a 
userB| 70 | b 
userB| 30 | d 

しかし、私は必要があります。

|userA| 13| a 
|userA| 7 | b 
|userA| 3 | d 
|userA| NULL| c 
|userB| 10| a 
|userB| 70 | b 
|userB| 30 | d 
|userB| NULL | c 

UPDATE_2 ご迷惑をおかけして申し訳ございません。

http://sqlfiddle.com/#!4/71069

マイSQL-クエリ、次のようにルックスをextentedする必要があります:

SELECT usr.user_name, 
     SUM (lg_all.new_values) AS group_sum, 
     allw.group_name 
FROM users usr, products lg_all, myGroup allw 
     WHERE usr.user_id = lg_all.user_id 
     AND allw.group_id = lg_all.group_id 
    GROUP BY (usr.USER_ID, allw.group_name) 
    ORDER BY usr.LOGONUSER_ID DESC 

私の結果は次のようになります。私は、OracleここではG11 たとえば、スキーマのリンクであるを使用し

userA| 13| a 
userA| 7 | b 
userA| 3 | d 
userB| 10| a 
userB| 70 | b 
userB| 30 | d 

しかし、私は必要があります。

|userA| 13| a 
|userA| 7 | b 
|userA| 3 | d 
|userA| NULL| c 
|userB| 10| a 
|userB| 70 | b 
|userB| 30 | d 
|userB| NULL | c 

Thx。

+1

あなたは正しい参加を試みましたか? –

答えて

0

あなたは一般的に、このためにleft joinを使用します。

select a.col1, sum(b.col1) 
from tableA a left join 
    tableB b 
    on a.col1 = b.col2 
group by a.col1; 
0

あなたは特に右の結合を使用する場合:

SELECT 
    a.col, 
    SUM(b.col) as sumof 
FROM 
    TableB b 
    RIGHT JOIN 
    TableA a 
    ON 
    b.col = a.col 
GROUP BY 
    a.col; 

は右「ソリッドデータを持つテーブルが」にちなんで命名され要求に参加言葉 "RIGHT JOIN"と "欠けているデータのあるテーブル"は前にあります。そうすれば、何も問題はないと思うのが好きです!私は左から右に書いているので、LEFTを使うのが普通です。私の頭の中にSQLを置くと、「すべてのソリッドテーブルは何ですか? "固体のテーブル"に "データホールを持つテーブル"を結合して、ソリッドデータが左にあり、それに穴のあるデータが結合されるようにします。

つまり、私は左から右に考えると思います。あなたが本当にあなたのUsersテーブルが構造化されてどのようにそれは明らかにされていないが、私は、これらのテーブル構造を前提と

を使用すると、左に右にと思うなら、あなたは右

Updateでご固体テーブルを好むかもしれません

create table Users (user varchar) 
create table tablea (groupname varchar) 
create table tableb (groupname varchar, groupcount int) 

ので、このクエリ:

SELECT 
    u.user, 
    a.groupname, 
    SUM(b.groupcount) as sumof 
FROM 
    TableB b 
    RIGHT JOIN 
    (
    SELECT * FROM 
    TableA a 
    CROSS APPLY 
    users u 
) a 
    ON 
    b.groupname = a.groupname 
GROUP BY 
    u.username, a.groupname; 

ユーザーテーブルとにtableAが関連している場合は、どのように言ってください。テーブル構造を投稿する方が良い。何もない場合は、SQL Server Management Studioで次の操作を実行し、スクリーンショットを投稿:

SELECT * FROM users 
SELECT * FROM tableA 
SELECT * FROM tableB 

データが機密である場合は、SQLFiddle.comに移動して、代表的な例を作成し、ここに

をURLを投稿

アップデート2:そのスキーマ内

若干の問題は、あなたが投稿例クエリに一致doesntの作ったが、大きな問題があります:あなたが投稿スキーマは、ユーザーとグループが製品を介した以外の方法で関連していないことを意味し表。 CROSS JOINですべてのユーザーとグループをミックスしてから製品をリンクする以外に、ユーザーとグループの価値を持つ行を与えるために行うことはできません。また、サンプルデータをフィディルドに入れませんでした。 Text to DDLをやりましたか?それはかなりきちんとしています:

SELECT 
    u.user_name, 
    g.group_id, 
    SUM(p.product_id) --you don't want to sum the id, but your schema doesnt have anything else! 
FROM 
    users u 
    CROSS JOIN 
    mygroup g 

    LEFT JOIN 
    products p 
    ON 
    u.user_id = p.user_id AND 
    g.group_id = p.group_id 

GROUP BY 
    u.user_name, 
    p.product_id 
+0

更新を見てください –

+0

@ MarkusSchnee更新 –

+0

thx、私はスキーマと現在のSQLクエリを作成しました。 Pls。 look_2 on –

関連する問題