2011-03-02 3 views
1

개별 제품/입국 날짜 별 마지막 4 주 동안 데이터를 얻기 위해, 그리고 각어떻게 내가 입력으로 사일이 문제가

이 마지막 4 주 동안 그들의 마지막 4 주 동안 값을 받아야합니까 나는 해결책이있는 최근 4 주간을 의미하지는 않습니다.

SELECT prodno, 
      ardate8n, 
      selloff1 
    FROM sales s 
      JOIN (SELECT CAST(DATE_SUB('2011-02-27', INTERVAL 1 WEEK) AS DECIMAL(8,0)) AS wdt, '2011-02-27' AS adt 
UNION ALL 
SELECT CAST(DATE_SUB('2011-02-27', INTERVAL 2 WEEK) AS DECIMAL(8,0)) AS wdt, '2011-02-27' AS adt 
UNION ALL 
SELECT CAST(DATE_SUB('2011-02-27', INTERVAL 3 WEEK) AS DECIMAL(8,0)) AS wdt, '2011-02-27' AS adt 
UNION ALL 
SELECT CAST(DATE_SUB('2011-02-27', INTERVAL 4 WEEK) AS DECIMAL(8,0)) AS wdt, '2011-02-27' AS adt 

UNION ALL 

SELECT CAST(DATE_SUB('2011-02-26', INTERVAL 1 WEEK) AS DECIMAL(8,0)) AS wdt, '2011-02-26' AS adt 
UNION ALL 
SELECT CAST(DATE_SUB('2011-02-26', INTERVAL 2 WEEK) AS DECIMAL(8,0)) AS wdt, '2011-02-26' AS adt 
UNION ALL 
SELECT CAST(DATE_SUB('2011-02-26', INTERVAL 3 WEEK) AS DECIMAL(8,0)) AS wdt, '2011-02-26' AS adt 
UNION ALL 
SELECT CAST(DATE_SUB('2011-02-26', INTERVAL 4 WEEK) AS DECIMAL(8,0)) AS wdt, '2011-02-26' AS adt 

UNION ALL 

SELECT CAST(DATE_SUB('2011-02-25', INTERVAL 1 WEEK) AS DECIMAL(8,0)) AS wdt, '2011-02-25' AS adt 
UNION ALL 
SELECT CAST(DATE_SUB('2011-02-25', INTERVAL 2 WEEK) AS DECIMAL(8,0)) AS wdt, '2011-02-25' AS adt 
UNION ALL 
SELECT CAST(DATE_SUB('2011-02-25', INTERVAL 3 WEEK) AS DECIMAL(8,0)) AS wdt, '2011-02-25' AS adt 
UNION ALL 
SELECT CAST(DATE_SUB('2011-02-25', INTERVAL 4 WEEK) AS DECIMAL(8,0)) AS wdt, '2011-02-25' AS adt 

UNION ALL 

SELECT CAST(DATE_SUB('2011-02-24', INTERVAL 1 WEEK) AS DECIMAL(8,0)) AS wdt, '2011-02-24' AS adt 
UNION ALL 
SELECT CAST(DATE_SUB('2011-02-24', INTERVAL 2 WEEK) AS DECIMAL(8,0)) AS wdt, '2011-02-24' AS adt 
UNION ALL 
SELECT CAST(DATE_SUB('2011-02-24', INTERVAL 3 WEEK) AS DECIMAL(8,0)) AS wdt, '2011-02-24' AS adt 
UNION ALL 
SELECT CAST(DATE_SUB('2011-02-24', INTERVAL 4 WEEK) AS DECIMAL(8,0)) AS wdt, '2011-02-24' AS adt) days 
      ON s.ardate8n = days.wdt 
    WHERE custno = 38726 
      AND deptno = 0 
      AND Find_in_set(prodno, '0020,0064,0070,0073,0096') > 0 
    ORDER by prodno,adt,ardate8n; 

가장 최근의 4 주를 하드 코드했습니다. 이것은 제품/입력 날짜 당 가장 최근의 4 주간 만 읽으며, 하나 이상의 주에 기록이 누락 된 경우 4 행을 얻지 못합니다.

그래서이 일에 관련된 일종의 제한을 동적으로 가져와야합니다. sales.ardate8n은 주어진 날짜에 대한 기록이 있는지 알려줍니다.

이 다음 데이터

은 입국 날짜 2011-03-03에 대한 참조로
0006, '2011-03-03', 20110127, 0 
0006, '2011-03-03', 20110203, 0 
0006, '2011-03-03', 20110210, 0 
0006, '2011-03-04', 20110128, 0 
0006, '2011-03-04', 20110204, 0 
0006, '2011-03-05', 20110129, 0 
0006, '2011-03-05', 20110205, 0 
0006, '2011-03-05', 20110212, 0 
0006, '2011-03-05', 20110219, 0 

을 반환하는 제품은 같은 평일에만 3 행이 있습니다. 및 입국 날짜가 2011-03-04 인 제품의 평일은 2 행뿐입니다.

답변

2

쉼표로 구분 된 목록 쿼리에 값 세트를 전달하는 편리한 방법이지만, 그것은 그것이 이것과 같은 상황에서 부적당 요청 된 모든 값이 데이터 집합에 있어야합니다. 따라서 목록으로 사용되는 대신 값은 데이터 열, 행 집합으로 만들어야합니다. 그러면 결과 집합에 모든 요소를 ​​포함시킬 수 있습니다.

위의 내용은 쿼리의 prodno 값 목록에 적용되지만 날짜에도 동일합니다.

SELECT 
    p.prodno, 
    d.date, 
    CAST(DATESUB(d.date, INTERVAL (w.weeksAgo) WEEK) AS DECIMAL(8, 0)) AS ardate8n, 
    s.selloff1 

FROM  (SELECT @date1 AS date 
    UNION ALL SELECT @date2 
    UNION ALL SELECT @date3 
    UNION ALL SELECT @date4) d 

CROSS JOIN (SELECT 1 AS weeksAgo 
    UNION ALL SELECT 2 
    UNION ALL SELECT 3 
    UNION ALL SELECT 4) w 

CROSS JOIN (SELECT '0020' AS prodno 
    UNION ALL SELECT '0064' 
    UNION ALL SELECT '0070' 
    UNION ALL SELECT '0073' 
    UNION ALL SELECT '0096') p 

LEFT JOIN sales s 
    ON s.ardate8n = CAST(DATESUB(d.date, INTERVAL (w.weeksAgo) WEEK) AS DECIMAL(8, 0)) 
AND s.prodno = p.prodno 
AND s.custno = 38726 
AND s.deptno = 0 
: 여기

는 입력 데이터가 데이터 세트에 사항이있는 경우 요구 사항을 충족 할 수있을 것입니다 방법의 예
1

판매 테이블의 날짜 범위를 시작 연도에서 종료 연도까지 가능한 모든 날짜가 포함 된 간단한 테이블을 추가합니다.

나는 날짜별로 테이블에 가입 할 것입니다.

여기에서 주어진 날짜를 상한으로 두겠습니다.

날짜별로 주문하겠습니다.

다음 단순히 :

select top 4 

가 가입하고 선택이 주어진 날짜의 코스 foreach 문이 될 것입니다.

그것은 훨씬 빠르고 효율적입니다

...

관련 문제