日期:2014-05-18  浏览次数:20344 次

關於一條語句裡 同時查詢本月結存和上月結存的問題
表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 '