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

關於一條語句裡 同時查詢本月結存和上月結存的問題解决方法

2012-02-15 
關於一條語句裡 同時查詢本月結存和上月結存的問題表1單號品號庫存數日期A001as2002202005.04.06A003as210

關於一條語句裡 同時查詢本月結存和上月結存的問題
表1

單號   品號   庫存數     日期
A001   as200     220         2005.04.06
A003   as210     0             2005.04.12
A003   as230     203         2005.04.18
A005   as230     240         2005.05.06
A006   as240     230         2005.05.25

怎麼按品號同時查詢   本月庫存和上月庫存?

如查詢2005年5月的結果如下:

品號         本月庫存數   上月庫存數
as200       220                 0
as210       0                     0
as230       240                 203
....

要求用一條語句

[解决办法]
CREATE TABLE tb([單號] varchar(10), [品號] varchar(10), [庫存數] INT, [日期] DATETIME)
INSERT INTO tb
SELECT 'A001 ', 'as200 ', 220, '2005.04.06 '
UNION ALL SELECT 'A003 ', 'as210 ', 0, '2005.04.12 '
UNION ALL SELECT 'A003 ', 'as230 ', 203, '2005.04.18 '
UNION ALL SELECT 'A005 ', 'as230 ', 240, '2005.05.06 '
UNION ALL SELECT 'A006 ', 'as240 ', 230, '2005.05.25 '

DECLARE @date DATETIME
SET @date = '2005/05/01 '
SELECT T.品號, 本月庫存數 = ISNULL((SELECT SUM(庫存數) FROM tb WHERE 品號 = T.品號 AND YEAR(日期) = YEAR(@date) AND MONTH(日期) = MONTH(@date)), 0)
, 上月庫存數 = ISNULL((SELECT SUM(庫存數) FROM tb WHERE 品號 = T.品號 AND YEAR(日期) = YEAR(DATEADD(MONTH, -1, @date)) AND MONTH(日期) = MONTH(DATEADD(MONTH, -1, @date))), 0)
FROM tb T

DROP TABLE tb
[解决办法]
结果:
品號 本月庫存數 上月庫存數
---------- ----------- -----------
as200 0 220
as210 0 0
as230 240 203
as230 240 203
as240 230 0
[解决办法]
declare @a table(單號 varchar(10),品號 varchar(10), 庫存數 int, 日期 datetime)
insert into @a
select 'A001 ', 'as200 ', 220 , '2005-04-06 '
union all
select 'A003 ', 'as210 ', 0 , '2005-04-12 '
union all
select 'A003 ', 'as230 ', 203 , '2005-04-18 '
union all
select 'A005 ', 'as230 ', 240 , '2005-05-06 '
union all
select 'A006 ', 'as240 ', 230 , '2005-05-25 '
select * from @a
select
[品號]
,sum(select [庫存數] from @a where datediff(month,[日期],getdate())=0 and T.[品號]=[品號]) as N '本月庫存數 '
,sum(select [庫存數] from @a where datediff(month,[日期],getdate())=-1 and T.[品號]=[品號]) as N '上月庫存數 '
from @a T
group by [品號]
[解决办法]
select 品號
,isnull((select sum(isnull(庫存數,0)) from T1 where datediff(month,日期,getdate())=0 and T.品號=品號),0) as 上月結存
,isnull((select sum(isnull(庫存數,0)) from T1 where datediff(month,日期,getdate())=-1 and T.品號=品號),0) as 本月結存
from T1 T

[解决办法]
declare @ta TABLE ([單號] varchar(10), [品號] varchar(10), [庫存數] INT, [日期] DATETIME)
INSERT INTO @ta
SELECT 'A001 ', 'as200 ', 220, '2005.04.06 '


UNION ALL SELECT 'A003 ', 'as210 ', 0, '2005.04.12 '
UNION ALL SELECT 'A003 ', 'as230 ', 203, '2005.04.18 '
UNION ALL SELECT 'A005 ', 'as230 ', 240, '2005.05.06 '
UNION ALL SELECT 'A006 ', 'as240 ', 230, '2005.05.25 '

declare @time datetime
set @time= '2005.05.12 '--这里定义为系统时间就行getdate()就行了

select [品號],
[本月庫存數]=sum(case convert(varchar(7),@time,120) when convert(varchar(7),[日期],120)
then [庫存數] else 0 end),
[上月庫存數]=sum(case convert(varchar(7),dateadd(month,-1,@time),120) when convert(varchar(7),[日期],120)
then [庫存數] else 0 end)
from @ta group by 品號


(5 行受影响)
品號 本月庫存數 上月庫存數
---------- ----------- -----------
as200 0 220
as210 0 0
as230 240 203
as240 230 0

(4 行受影响)

热点排行