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

各位师兄!求一条sql语句,有点难度

2012-01-30 
各位师兄救命啊!求一条sql语句,有点难度!现有两个表T1系统盘点表、T2实际库存表(人工盘点)表具体如下:T1(系

各位师兄救命啊!求一条sql语句,有点难度!
现有两个表T1系统盘点表、T2实际库存表(人工盘点)表具体如下:
T1(系统):
      SKU                       货物批号                   生产日期                         数量
-------------------------
    10001                   20060606001A           2006-06-06                       120
    10001                   20060606001A           2006-06-07                       300
    10002                   20060607001A           2006-06-07                       200
    10001                   20070708006C           2006-07-08                       150
    10003                   20070608008F           2007-06-05                       300
    10004                   20070608008F           2007-06-05                       8


T2(实际):
      SKU                       货物批号                   生产日期                         数量
-------------------------
    10001                   20060606001A           2006-06-06                       116
    10002                   20060607001A           2006-06-07                       200
    10001                   20070708006C           2006-07-08                       155
    10003                   20070608008F           2007-06-05                       300
    10001                   20060606001E           2006-06-06                       100
   

我想要这两个表数据进行比较,比较要求是SKU、货物批号、生产日期都需要一样才能进行数量比较,如果系统盘点表有实际盘点表没有需要注明“系统”,反之“库房”,想要的

结果如下:
      SKU             货物批号           生产日期           系统数       实际数       差异(系统-实际)           备注
--------------------------------------------------


    10001     20060606001A       2006-06-06             120           116                     4                                 正常
    10002     20060607001A       2006-06-07             200           200                     0                                 正常
    10001     20070708006C       2006-07-08             150           155                     -5                               正常
    10004     20070608008F       2007-06-05             8               0                         8                                 系统
    10001     20060606001E       2006-06-06             0               100                     -100                           库房
    10001     20060606001A       2006-06-07             300           0                         300                             系统

谢谢各位兄弟了!


[解决办法]
select SKU=isnull(a.SKU,b.SKU),
货物批号=isnull(a.货物批号,b.货物批号),
生产日期=isnull(a.生产日期,b.生产日期),
系统数=isnull(a.数量,0),
实际数=isnull(b.数量,0),
[差异(系统-实际)]=isnull(a.数量-b.数量,0),
备注=case when isnull(a.数量,0)=0 then '库房 ' when isnull(b.数量,0)=0 then '系统 ' else '正常 ' end
from t1 a full join t2 b on a.SKU=b.SKU and a.货物批号=b.货物批号 and a.生产日期=b.生产日期
[解决办法]
---现有两个表T1系统盘点表、T2实际库存表(人工盘点)表具体如下:


create table T1(SKU int,货物批号 varchar(20),生产日期 datetime,数量 int)
insert T1
select 10001 , '20060606001A ', '2006-06-06 ', 120
union select 10001 , '20060606001A ', '2006-06-07 ', 300
union select 10002 , '20060607001A ', '2006-06-07 ', 200
union select 10001 , '20070708006C ', '2006-07-08 ', 150
union select 10003 , '20070608008F ', '2007-06-05 ', 300
union select 10004 , '20070608008F ', '2007-06-05 ', 8


create table T2(SKU int,货物批号 varchar(20),生产日期 datetime,数量 int)
insert T2
select 10001 , '20060606001A ', '2006-06-06 ', 116
union select 10002 , '20060607001A ', '2006-06-07 ', 200


union select 10001 , '20070708006C ', '2006-07-08 ', 155
union select 10003 , '20070608008F ', '2007-06-05 ', 300
union select 10001 , '20060606001E ', '2006-06-06 ', 100


select SKU=isnull(a.SKU,b.SKU),
货物批号=isnull(a.货物批号,b.货物批号),
生产日期=isnull(a.生产日期,b.生产日期),
系统数=isnull(a.数量,0),
实际数=isnull(b.数量,0),
[差异(系统-实际)]=isnull(a.数量-b.数量,0),
备注=case when isnull(a.数量,0)=0 then '库房 ' when isnull(b.数量,0)=0 then '系统 ' else '正常 ' end
from t1 a full join t2 b on a.SKU=b.SKU and a.货物批号=b.货物批号 and a.生产日期=b.生产日期


drop table t1,t2

/*
SKU 货物批号 生产日期 系统数 实际数 差异(系统-实际) 备注
----------- -------------------- ------------------------- ----------- ----------- --------------- ----
10001 20060606001A 2006-06-06 00:00:00.000 120 116 4 正常
10001 20060606001A 2006-06-07 00:00:00.000 300 0 0 系统
10001 20070708006C 2006-07-08 00:00:00.000 150 155 -5 正常
10002 20060607001A 2006-06-07 00:00:00.000 200 200 0 正常
10003 20070608008F 2007-06-05 00:00:00.000 300 300 0 正常
10004 20070608008F 2007-06-05 00:00:00.000 8 0 0 系统
10001 20060606001E 2006-06-06 00:00:00.000 0 100 0 库房

(7 row(s) affected)
*/
[解决办法]
select (case when a.sku is null then b.sku else a.sku end) as sku,
(case when a.货物批号 is null then b.货物批号 else a.货物批号 end) as '货物批号 ',
(case when a.生产日期 is null then b.生产日期 else a.生产日期 end) as '生产日期 ',
(case when a.sku is null then 0 else a.数量 end) as '系统数 ',
(case when b.sku is null then 0 else b.数量 end) as '实际数 ',
((case when a.sku is null then 0 else a.数量 end)-
(case when b.sku is null then 0 else b.数量 end)) as '差异‘,
(case when a.sku is null then '库存 'when b.sku is null then '系统 'else '正常 'end) as '备注 '
from T1 a full join T2 b on
a.sku=b.sku and a.货物批号=b.货物批号 and a.生产日期=b.生产日期



[解决办法]
select isnull(t1.SKU,t2.SKU) SKU , isnull(t1.货物批号,t2.货物批号) 货物批号,
isnull(t1.生产日期,t2.生产日期) 生产日期,isnull(t1.数量,0) 系统数,isnull(t2.数量,0) 实际数,
isnull(t1.数量,0) - isnull(t2.数量,0) 差异(系统-实际),
备注 = case when t1.数量 is null then '库房 '
when t2.数量 is null then '系统 '
else '正常 '
end
from t1 full join t2 on t1.SKU = t2.SKU and t1.货物批号=t2.货物批号 and t1.生产日期 = t2.生产日期
[解决办法]
create table t1(SKU varchar(10),货物批号 varchar(20),生产日期 varchar(10),数量 int)
insert into t1 values( '10001 ', '20060606001A ', '2006-06-06 ',120)
insert into t1 values( '10001 ', '20060606001A ', '2006-06-07 ',300)
insert into t1 values( '10002 ', '20060607001A ', '2006-06-07 ',200)
insert into t1 values( '10001 ', '20070708006C ', '2006-07-08 ',150)
insert into t1 values( '10003 ', '20070608008F ', '2007-06-05 ',300)
insert into t1 values( '10004 ', '20070608008F ', '2007-06-05 ',8)
create table t2(SKU varchar(10),货物批号 varchar(20),生产日期 varchar(10),数量 int)


insert into t2 values( '10001 ', '20060606001A ', '2006-06-06 ',116)
insert into t2 values( '10002 ', '20060607001A ', '2006-06-07 ',200)
insert into t2 values( '10001 ', '20070708006C ', '2006-07-08 ',155)
insert into t2 values( '10003 ', '20070608008F ', '2007-06-05 ',300)
insert into t2 values( '10001 ', '20060606001E ', '2006-06-06 ',100)
go
select isnull(t1.SKU,t2.SKU) SKU , isnull(t1.货物批号,t2.货物批号) 货物批号,
isnull(t1.生产日期,t2.生产日期) 生产日期,isnull(t1.数量,0) 系统数,
isnull(t2.数量,0) 实际数,isnull(t1.数量,0) - isnull(t2.数量,0) 差异,
备注 = case when t1.数量 is null then '库房 '
when t2.数量 is null then '系统 '
else '正常 '
end
from t1 full join t2
on t1.SKU = t2.SKU and t1.货物批号=t2.货物批号 and t1.生产日期 = t2.生产日期
order by t1.SKU ,t1.货物批号 , t1.生产日期
drop table t1,t2

/*
SKU 货物批号 生产日期 系统数 实际数 差异 备注
---------- -------------------- ---------- ----------- ----------- ----------- ----
10001 20060606001A 2006-06-06 120 116 4 正常
10001 20060606001A 2006-06-07 300 0 300 系统
10001 20060606001E 2006-06-06 0 100 -100 库房
10001 20070708006C 2006-07-08 150 155 -5 正常
10002 20060607001A 2006-06-07 200 200 0 正常
10003 20070608008F 2007-06-05 300 300 0 正常
10004 20070608008F 2007-06-05 8 0 8 系统

(所影响的行数为 7 行)
*/

[解决办法]
SELECT (case when T1.SKU is NULL then T2.SKU else T1.SKU end) as SKU,
(case when T1.货物批号 is null then T2.货物批号 else T1.货物批号 end) as '货物批号 ',
(case when T1.生产日期 is null then T2.生产日期 else T1.生产日期 end) as '生产日期 ',
(case when T1.SKU is null then 0 else T1.数量 end) as '系统数 ',
(case when T2.SKU is null then 0 else T2.数量 end) as '实际数 ',
((case when T1.SKU is null then 0 else T1.数量 end)-
(case when T2.SKU is null then 0 else T2.数量 end)) as '差异 ',
(case when T1.SKU is null then '库房 ' when T2.SKU is null then '系统 ' else '正常 ' end) as '备注 '
from T1 full join T2 on
T1.SKU=T2.SKU and T1.货物批号=T2.货物批号 and T1.生产日期=T2.生产日期

执行结果:
1000120060606001A 2006-06-06 00:00:00.0001201164正常
1000120060606001A 2006-06-07 00:00:00.0003000300系统
1000120060606001E 2006-06-06 00:00:00.0000100-100库房
1000120070708006C 2006-07-08 00:00:00.000150155-5正常
1000220060607001A 2006-06-07 00:00:00.0002002000正常
1000320070608008F 2007-06-05 00:00:00.0003003000正常
1000420070606008F 2007-06-05 00:00:00.000808系统

热点排行