SQL中的一个简单查询
我有两张桌子。每个表有两列SQL中的一个简单查询,sql,count,group-by,having,Sql,Count,Group By,Having,我有两张桌子。每个表有两列 DocumentNumber price 我想使用查询来显示每个表中相同的documentnumber和ducumentnumber计数。 我用了这个密码 Select Sheet.DocumentNumber , Sheet2.DocumentNumber ,Count(sheet.documentnumber) , Count(sheet2.documentnumber) From Sheet,Sheet2 whe
DocumentNumber price
我想使用查询来显示每个表中相同的documentnumber和ducumentnumber计数。
我用了这个密码
Select Sheet.DocumentNumber , Sheet2.DocumentNumber ,Count(sheet.documentnumber) , Count(sheet2.documentnumber)
From Sheet,Sheet2
where sheet.DocumentNumber=sheet2.DocumentNumber
group by sheet.DocumentNumber , Sheet2.DocumentNumber
但它没有计算文档编号,而是显示了两列的笛卡尔坐标
我想显示每个表的价格和(sheet.price)减去(sheet.price)
请完成我的查询。您应该使用正确的连接语法。特别是,您应该使用
完全外部联接
,因为文档可能在一个或另一个表中没有记录
第二,因为你不想计算重复,你需要计算一些东西。以下假设每个表中都有一个id
列(某种类型):
Select coalesce(s.DocumentNumber, s2.DocumentNumber) as DocumentNumber,
Count(distinct s.id), Count(distinct s2.id)
From Sheet s full outer join
Sheet2 s2
on s.DocumentNumber = s2.DocumentNumber
group by coalesce(s.DocumentNumber, s2.DocumentNumber);
如果您没有id
列,或者如果您的数据库不支持完全外部联接
,则以下操作也将起作用:
select DocumentNumber, max(cnt_s) as cnt_s, max(cnt_s2) as cnt_s2
from ((select DocumentNumber, count(*) as cnt_s, 0 as cnt_s2
from Sheet s
group by DocumentNumber
) union all
(select DocumentNumber, 0, count(*) as cnt_s2
from Sheet2 s2
group by DocumentNumber
)
) t
group by DocumentNumber;
编辑:
union-all
方法实际上更划算:
select DocumentNumber, max(cnt_s) as cnt_s, max(cnt_s2) as cnt_s2,
max(price_s) - max(price_s2)
from ((select DocumentNumber, count(*) as cnt_s, 0 as cnt_s2,
sum(price) as price_s, 0 as price_s2
from Sheet s
group by DocumentNumber
) union all
(select DocumentNumber, 0, count(*) as cnt_s2,
0, sum(price) as price_s2
from Sheet2 s2
group by DocumentNumber
)
) t
group by DocumentNumber;
注意:此版本将缺少的价格视为0。对于这种情况,您可能需要将
0
替换为NULL
。谢谢。您显示的所有查询,e都有效。我用了第三个。太棒了。但在第三张中,我想显示第一张的价格和第二张的价格。然后是价格1和价格2之间的负数