안녕하세요.
프로시저 작성 중 데이터 추출이 어려운 부분이 있어 문의드립니다.
데이터 : 품목/계획일자별 계획수량이 등록되어 있습니다.
Table : tbDayPlan
등록일 (StdDt) | 품목(ModelCode) | 계획일 (PlanDt) | 계획수량 (Qty) |
2017-01-01 | A | 2017-01-01 | 100 |
2017-01-01 | A | 2017-01-02 | 100 |
2017-01-01 | A | 2017-01-03 | 100 |
2017-01-01 | B | 2017-01-01 | 100 |
2017-01-01 | B | 2017-01-02 | 120 |
2017-01-02 | A | 2017-01-02 | 200 |
2017-01-02 | A | 2017-01-02 | 230 |
2017-01-02 | A | 2017-01-03 | 200 |
2017-01-02 | B | 2017-01-02 | 150 |
2017-01-03 | A | 2017-01-03 | 300 |
원하는 결과 : 품목별 계획일 정보 중 최종일자 기준으로 계획수량 추출
품목 | 계획일 | 수량 |
A | 2017-01-01 | 100 |
A | 2017-01-02 | 200 |
A | 2017-01-03 | 300 |
B | 2017-01-01 | 100 |
B | 2017-01-02 | 150 |
품목/계획일자별 수량은 등록일자 별로 여러건이 있을수 있고,
그런경우 최종등록일 기준으로 계획수량을 추출해야 합니다.
Temp 테이블에 넣어놓고 지지고 볶아보는데 어렵네요.
머리를 싸매어봐도 서브쿼리 TOP 1 밖에는 생각이 나지 않습니다.
어떤식으로 접근하면 속도문제없이 해결할 수 있을까요?
조언 부탁드립니다.
Comment 2
-
건우아빠
2017.02.21 15:46
-
디비하는조씨
2017.02.27 14:27
CREATE TABLE dbo.tbDayPlan(StdDt datetime, ModelCode char(1), PlanDt datetime, Qty int);GOINSERT INTO dbo.tbDayPlan(StdDt, ModelCode, PlanDt, Qty) VALUES ('2017-01-01', 'A', '2017-01-01', 100), ('2017-01-01', 'A', '2017-01-02', 100), ('2017-01-01', 'A', '2017-01-03', 100), ('2017-01-01', 'B', '2017-01-01', 100), ('2017-01-01', 'B', '2017-01-02', 120), ('2017-01-02', 'A', '2017-01-02', 200), ('2017-01-02', 'A', '2017-01-02', 230), ('2017-01-02', 'A', '2017-01-03', 200), ('2017-01-02', 'B', '2017-01-02', 150), ('2017-01-03', 'A', '2017-01-03', 300);GOSELECT a.ModelCode, a.PlanDt, CONVERT(int, STUFF(MAX(CONVERT(char(10), a.StdDt, 121) + CONVERT(varchar(MAX), a.Qty)), 1, 10, '')) AS QtyFROM dbo.tbDayPlan AS a WITH(NOLOCK)GROUP BY a.ModelCode, a.PlanDtORDER BY a.ModelCode, a.PlanDt;GO윗분 말씀처럼 예가 이상한듯...말한 기준에 의하면 요 정도면 될것 같은데요
문젠
2017-01-02
A
2017-01-02
200
2017-01-02
A
2017-01-02
230
이건의 기준이 없네요...
with tbDayPlan
as
(
select '2017-01-01' StdDt , 'A' ModelCode , '2017-01-01' PlanDt , 100 Qty union all
select '2017-01-01' StdDt , 'A' ModelCode , '2017-01-02' PlanDt , 100 Qty union all
select '2017-01-01' StdDt , 'A' ModelCode , '2017-01-03' PlanDt , 100 Qty union all
select '2017-01-01' StdDt , 'B' ModelCode , '2017-01-01' PlanDt , 100 Qty union all
select '2017-01-01' StdDt , 'B ' ModelCode , '2017-01-02' PlanDt , 120 Qty union all
select '2017-01-02' StdDt , 'A' ModelCode , '2017-01-02' PlanDt , 200 Qty union all
select '2017-01-02' StdDt , 'A' ModelCode , '2017-01-02' PlanDt , 230 Qty union all
select '2017-01-02' StdDt , 'A' ModelCode , '2017-01-03' PlanDt , 200 Qty union all
select '2017-01-02' StdDt , 'B ' ModelCode , '2017-01-02' PlanDt , 150 Qty union all
select '2017-01-03' StdDt , 'A' ModelCode , '2017-01-03' PlanDt , 300 Qty )
select b.*
from ( select ModelCode , PlanDt , MAX(StdDt ) StdDt
from tbDayPlan
group by ModelCode , PlanDt ) a
cross apply
(
select top 1 *
from tbDayPlan
where ModelCode = a.ModelCode
and PlanDt = a.PlanDt
and StdDt = a.StdDt
order by qty ) b
order by a.ModelCode , a.PlanDt ,a.StdDt