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之间的负数