首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > SQL Server >

从两个表里汇总数量同时显示出来,sql语句怎么写

2013-12-11 
从两个表里汇总数量同时显示出来,sql语句如何写?有两个表:A: RQ,SL,MC,TH ....201305021AAA1-1201305021BB

从两个表里汇总数量同时显示出来,sql语句如何写?
有两个表:
A: RQ,SL,MC,TH ....
20130502  1  AAA   1-1
20130502  1  BBB   1-2
20130502  1  CCC   1-3
20131012  1  AAA   1-1
20131012  1  BBB  1-2
20131013  1  DDD  1-4
B:RQ,DJSL,MC,TH....
20130502  1   AAA 1-1
20130502  1   CCC  1-3
20130503  1   BBB 1-2 
20131012  1   AAA  1-1

我现在需要一条sql语句按日期统计查询,统计这两个表日期相同的那天数量的合计数
我查询20130502
则显示
 RQ          SUM(A.SL)  SUM(B.SL)
20130502     3          2
查询20131012
RQ          SUM(A.SL)  SUM(B.SL)
20131012     2         1
查询20131013
RQ          SUM(A.SL)  SUM(B.SL)
20131013       1


     
[解决办法]


if object_id('Tempdb..#A') is not null drop table #A
if object_id('Tempdb..#B') is not null drop table #B
 create table #A(
[RQ] VARCHAR(8)   null,
[SL] int null,
[MC] VARCHAR(8)   null,
[TH] VARCHAR(10)

 create table #B(
[RQ] VARCHAR(8)   null,
[SL] int null,
[MC] VARCHAR(8)   null,
[TH] VARCHAR(10)

INSERT INTO #A
select '20130502',1,'AAA','1-1' union all
select '20130502',1,'BBB','1-2' union all
select '20130502',1,'CCC','1-3' union all
select '20131012',1,'AAA','1-1' union all
select '20131012',1,'BBB','1-2' union all
select '20131013',1,'DDD','1-4'

INSERT INTO #B
select '20130502',1,'AAA','1-1' union all
select '20130502',1,'CCC','1-3' union all
select '20130503',1,'BBB','1-2' union all
select '20131012',1,'AAA','1-1'  
 

declare @rq varchar(8)
set @rq='20130502'
select a.RQ,sum(isnull(a.SL,0)) AS ASum,SUM(isnull(b.SL,0)) as BSum from #A a left join #B b on a.RQ=b.RQ and a.MC=b.MC and a.TH=b.TH
WHERE a.RQ=@RQ
GROUP BY a.RQ

--------------------------
(6 行受影响)

(4 行受影响)
RQ       ASum        BSum
-------- ----------- -----------
20130502 3           2

(1 行受影响)

[解决办法]
SELECT T.RQ,SUM(T.ASUM) AS ASUM,SUM(T.BSUM) AS BSUM
FROM (
     SELECT A.RQ,A.SL AS ASUM,0 AS BSUM
     FROM A
     UNION ALL
     SELECT B.RQ,0 AS ASUM,B.SL AS BSUM
     FROM B
)T
GROUP BY T.RQ

#2楼的SQL 如果B表里存在A表中没有的RQ,这个RQ就不会显示在查询结果里了。
[解决办法]
这个就可以:



if object_id('A') is not null 
   drop table A
go

if object_id('B') is not null 
   drop table B
go

create table A(
[RQ] VARCHAR(8)   null,
[SL] int null,
[MC] VARCHAR(8)   null,
[TH] VARCHAR(10)

 create table B(
[RQ] VARCHAR(8)   null,
[SL] int null,
[MC] VARCHAR(8)   null,
[TH] VARCHAR(10)


INSERT INTO A
select '20130502',1,'AAA','1-1' union all
select '20130502',1,'BBB','1-2' union all
select '20130502',1,'CCC','1-3' union all
select '20131012',1,'AAA','1-1' union all
select '20131012',1,'BBB','1-2' union all


select '20131013',1,'DDD','1-4'

INSERT INTO B
select '20130502',1,'AAA','1-1' union all
select '20130502',1,'CCC','1-3' union all
select '20130503',1,'BBB','1-2' union all
select '20131012',1,'AAA','1-1'  
 
go


--查询20130502
select rq,
       sum(case when flag = 'A' then sl else 0 end) as 'SUM(A.SL)',
       sum(case when flag = 'B' then sl else 0 end) as 'SUM(B.SL)'
from 
(
select rq,sl,'A' as flag from a
union all
select rq,sl,'B' as flag from b
)t
where t.rq = '20130502'
group by rq
/*
rq       SUM(A.SL)   SUM(B.SL)
-------- ----------- -----------
20130502 3           2
*/


--查询 20131012
select rq,
       sum(case when flag = 'A' then sl else 0 end) as 'SUM(A.SL)',
       sum(case when flag = 'B' then sl else 0 end) as 'SUM(B.SL)'
from 
(
select rq,sl,'A' as flag from a
union all
select rq,sl,'B' as flag from b
)t
where t.rq = '20131012'
group by rq
/*
rq       SUM(A.SL)   SUM(B.SL)
-------- ----------- -----------
20131012 2           1
*/


--查询 20131013
select rq,
       sum(case when flag = 'A' then sl else 0 end) as 'SUM(A.SL)',
       sum(case when flag = 'B' then sl else 0 end) as 'SUM(B.SL)'
from 
(
select rq,sl,'A' as flag from a
union all
select rq,sl,'B' as flag from b
)t
where t.rq = '20131013'
group by rq
/*
rq       SUM(A.SL)   SUM(B.SL)
-------- ----------- -----------
20131013 1           0
*/


[解决办法]
呵呵
select rq=case when isnull(a.rq,'')='' then b.rq else a.rq end,sum(a.sl),sum(b.sl) from a full join b
on a.rq=b.rq where (a.rq='20130502' or b.rq='20130502')
group by case when isnull(a.rq,'')='' then b.rq else a.rq end

热点排行