通过右外连接分组

时间:2017-08-01 11:09:59

标签: sql oracle11g group-by right-join

需要组合group-by和right-outer-join。

  

TableA有群组" a"," b"," c"," d"

     

TableB有:12 | a,2 | b,1 | a 5 | b 3 | d几次。

我将TableB分组为该组的视图,如下所示:

  

ViewB:13 | a 7 | b 3 | d

如您所见,分组" c"不在TableB中,也不在ViewB中。我需要这样的外连接:

  

ViewB 13 | a 7 | b 3 | d null | c

我怎么能做到这一点?

更新 我知道,这个简单的例子没有描述复杂性。 另外,我有第三个表"用户" 因此,对于每个TableA-Values,为每个用户分组。 实施例

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

Group" 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 对不起,信息较少。我使用oracle g11 以下是示例模式的链接:

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

我应该扩展的Sql-Query看起来像这样:

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

我的结果如下:

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。

2 个答案:

答案 0 :(得分: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;

答案 1 :(得分: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"以及缺少数据的"表#34;以前..如果你喜欢这样的事情没有问题!我倾向于一直使用LEFT join,因为我从左到右书写,所以当我把我的SQL放在脑子里时,我想"什么是实心表......以及有洞的是什么。 .."并且我加入了数据漏洞"表格#34;在"固定的桌子上#34;这样,实体数据就在左边,然后在它上面加入带孔的数据..

即。我想从左到右。如果您认为从右到左,您可能更喜欢右侧的实心表格

更新

您还没有明确说明您的Users表的结构,但我假设这些表格结构:

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;

如果您的用户表和表格A相关,请说明如何。最好还是发布你的表格结构。如果没有别的,请在SQL Server Management Studio中执行以下操作并发布屏幕截图:

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

如果数据是保密的,请转到SQLFiddle.com并制作代表性示例,然后将URL发布到此处

Update2:

轻微的问题在于,您所制作的架构与您发布的示例查询不匹配,但存在更大的问题:您发布的架构暗示用户和群组除了通过产品表之外不以任何方式相关。除了在CROSS JOIN中混合所有用户和组然后链接产品之外,没有什么可以为您提供具有用户和组值的行。您也没有放任何小提琴中的样本数据。你有没有给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