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

如何得到这样的日期(量够日期)?
T1:

产品 计划数量
-----------------
A 600
B 800


T2:

产品 日期 实际数量
-----------------------
A 1.1 300
A 1.2 400
A 1.3 200
B 1.1 300
B 1.2 300
B 1.3 300


如何根据以上两个表得到下列结果?

产品 量够日期
-----------------
A 1.2
B 1.3

------解决方案--------------------
SQL code

--> 测试数据: @T1
declare @T1 table (产品 varchar(1),计划数量 int)
insert into @T1
select 'A',600 union all
select 'B',800

declare @T2 table (产品 varchar(1),日期 numeric(2,1),实际数量 int)
insert into @T2
select 'A',1.1,300 union all
select 'A',1.2,400 union all
select 'A',1.3,200 union all
select 'B',1.1,300 union all
select 'B',1.2,300 union all
select 'B',1.3,300

;with maco as
(
select b.产品,日期,
实际数量和=(select sum(实际数量) from @T2 where 产品=b.产品 and 日期<=b.日期),a.计划数量
from @T2 b left join @T1 a on a.产品=b.产品 
)

select 产品,min(日期) as 量够日期 from maco where 实际数量和>计划数量 group by 产品
/*
产品   量够日期
---- ---------------------------------------
A    1.2
B    1.3
*/

------解决方案--------------------
SQL code
----------------------------
-- Author  :fredrickhu(小F,向高手学习)
-- Date    :2012-02-03 16:37:24
-- Version:
--      Microsoft SQL Server 2008 R2 (RTM) - 10.50.1617.0 (Intel X86) 
--    Apr 22 2011 11:57:00 
--    Copyright (c) Microsoft Corporation
--    Enterprise Evaluation Edition on Windows NT 6.1 <X64> (Build 7600: ) (WOW64)
--
----------------------------
--> 测试数据:[T1]
if object_id('[T1]') is not null drop table [T1]
go 
create table [T1]([产品] varchar(1),[计划数量] int)
insert [T1]
select 'A',600 union all
select 'B',800
--> 测试数据:[t2]
if object_id('[t2]') is not null drop table [t2]
go 
create table [t2]([产品] varchar(1),[日期] numeric(2,1),[实际数量] int)
insert [t2]
select 'A',1.1,300 union all
select 'A',1.2,400 union all
select 'A',1.3,200 union all
select 'B',1.1,300 union all
select 'B',1.2,300 union all
select 'B',1.3,300
--------------开始查询--------------------------
;with f as
(
select 产品,日期,数量=(select sum(实际数量) from t2 where 产品=t.产品 and 日期<=t.日期) from t2 t
)

select 
  a.产品,b.日期
from
  T1 a
cross apply
  (select top 1 日期 from f where 数量>=计划数量 and 产品=a.产品)b
----------------结果----------------------------
/* 产品   日期
---- ---------------------------------------
A    1.2
B    1.3

(2 行受影响)
*/

------解决方案--------------------
SQL code
--T1:
--产品 计划数量
-------------------
--A 600
--B 800
--T2:
--产品 日期 实际数量
-------------------------
--A 1.1 300
--A 1.2 400
--A 1.3 200
--B 1.1 300
--B 1.2 300
--B 1.3 300
--如何根据以上两个表得到下列结果?

--产品 量够日期
-------------------
--A 1.2
--B 1.3

if OBJECT_ID('T1')is not null 
drop table T1
go 
create table T1 (产品 varchar(50),计划数量 int)
insert into T1 SELECT 'A',600 UNION ALL
SELECT 'B',800  

if OBJECT_ID('T2')is not null 
drop table T2
go 
create table T2 (产品 varchar(50),日期 decimal(18,1),实际数量 int)
insert into T2  
SELECT 'A',1.1,300 UNION ALL
SELECT 'A',1.2,400 UNION ALL
SELECT 'A',1.3,200 UNION ALL
SELECT 'B',1.1,300 UNION ALL
SELECT 'B',1.2,300 UNION ALL
SELECT 'B',1.3,300 

     
     --如何根据以上两个表得到下列结果?

--产品 量够日期
-------------------
--A 1.2
--B 1.3
     
 
     
  select a.产品,min(b.日期) as 日期
 from T1 a left join
  (select 产品,日期,数量=(select sum(实际数量) from t2 where 产品=t.产品 and 日期<=t.日期) from t2 t)b
  on a.产品=b.产品 and a.计划数量<b.数量  group by a.产品,a.计划数量
 




产品                                                 日期
-------------------------------------------------- ---------------------------------------
A                                                  1.2
B                                                  1.3

(2 行受影响)