Sql 具有右外部联接的分组依据
需要将group by和右外部联接合并 表a分为“a”、“b”、“c”、“d”组 表b有:12 | a,2 | b,1 | a 5 | b 3 | d几次 我将表格B分组为小组的视图,如下所示: 视图b:13 | a 7 | b 3 | d 如您所见,组“c”不在表B中,也不在视图B中。我需要一些像这样的外部连接:Sql 具有右外部联接的分组依据,sql,oracle11g,group-by,right-join,Sql,Oracle11g,Group By,Right Join,需要将group by和右外部联接合并 表a分为“a”、“b”、“c”、“d”组 表b有:12 | a,2 | b,1 | a 5 | b 3 | d几次 我将表格B分组为小组的视图,如下所示: 视图b:13 | a 7 | b 3 | d 如您所见,组“c”不在表B中,也不在视图B中。我需要一些像这样的外部连接: select right outer join TableA on TableB.id = TableA.id join TableC on TableB.other_id = Ta
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
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
视图b 13 | a 7 | b 3 | d空值| c
我怎样才能做到
更新。
我明白了,这个简单的例子并没有描述复杂性。
此外,我还有第三个表“用户”
因此,为每个用户分组,为每个TableA值分组。
范例
组“c”不在表B中(表B包含组的值)
当我尝试这样的查询时:
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
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
我只是得到了这样的东西:
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
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
|userA| 13| a
|userA| 7 | b
|userA| 3 | d
|userA| NULL| c
|userB| 10| a
|userB| 70 | b
|userB| 30 | d
|userB| NULL | c
更新_2
对不起,信息少了。我使用oracleg11
以下是架构示例的链接:
我的Sql查询(应该扩展)如下所示:
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
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
我的结果如下所示:
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
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
|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.您通常会使用
左连接来实现以下目的:
select a.col1, sum(b.col1)
from tableA a left join
tableB b
on a.col1 = b.col2
group by a.col1;
如果您特别想使用右连接:
SELECT
a.col,
SUM(b.col) as sumof
FROM
TableB b
RIGHT JOIN
TableA a
ON
b.col = a.col
GROUP BY
a.col;
右连接要求“具有可靠数据的表”以单词“右连接”命名,而“具有缺少数据的表”则以单词“右连接”命名。。如果你喜欢这样想的话,没问题!我总是倾向于使用左连接,可能是因为我是从左到右写的,所以当我把SQL放在脑海中时,我会想“什么是所有的实心表…什么是有孔的表…”,然后我将“有数据孔的表”连接到“实心表”上,这样实心数据就在左边,在它上面,数据与孔连接在一起
i、 我认为从左到右。如果你从右向左思考,你可能更喜欢右边的实心桌子
更新:
您还没有真正弄清楚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发布到此处
更新2:
有一个小问题,您创建的模式与您发布的示例查询不匹配,但还有一个更大的问题:您发布的模式意味着用户和组之间除了通过product表之外没有任何关系。除了在交叉连接中混合所有用户和组,然后将产品链接到中之外,无法为用户和组提供具有值的行。你也没有在你的小提琴里放任何样本数据。你发短信给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
你试过正确的连接吗?thx,我已经创建了一个模式和我当前的sql查询。请。查看更新_2@MarkusSchnee情况越来越糟了o:)显然,我不能计算id;)但对我来说真正重要的信息是,当前的模式不能提供我需要的结果?我应该如何改变我的shema?老实说,我真的不确定,因为事物的命名并不能让我真正了解你是如何考虑对数据建模的。在我看来,用户和产品都可以分组。显然,这里分组的不是用户,而是产品,但是您的查询说您需要一个产品为空的所有用户和组的列表。现在,虽然一个产品有一个用户和一个组,但是用户和组之间没有关系,那么为什么我们需要一个查询,它必须发明用户组对,以便发现没有一个产品有用户组?