2014-03-28 1 views
0

저는 SQL (~ 9 개월 정도)에 대해 상당히 익숙하므로 SQL을 사용하여이 문제를 파악하려고 노력하는 것입니다. 서버 2012날짜를 기준으로 두 SQL 테이블을 일치해야하지만 날짜 + 1을 확인해야합니다.

I는 다음과 같이 두 개의 테이블이 일치하기 위해 노력하고있어 :

Shift :

Date  | Name | Shift 
    01-01-2013 | Dan Smith | Night 
    01-02-2013 |John Johnson| Night 
    01-03-2013 |John Johnson| Night 

Sales :

Date  | Name | Sales 
    01-01-2013 | Dan Smith | 3 
    01-02-2013 | Dan Smith | 5 
    01-02-2013 |John Johnson| 4 
    01-03-2013 |John Johnson| 7 
    01-04-2013 |John Johnson| 2 

문제는 근무 교대가 근무일 시작 날짜 만 포함한다는 것입니다.이 교대 근무일은 2 일 동안 발생하는 야간 근무에 문제가 있습니다. 밤 근무 시간의 판매는 발생했을 때 시간 소인이 찍히는 양일에 걸쳐 발생하는 것으로 나타납니다. 즉, 단순히 이름과 이동 날짜를 기반으로 테이블을 연결하려고 시도하고 그 사람이 다음날 근무를하지 않으면 12:00 AM 이후에 판매 데이터를 놓치게됩니다. 그 사람이 다음날 근무를 확인하는 방법을 찾고 있는데, 그렇지 않은 경우 다음날 판매 데이터를 전날 판매액에 추가합니다.

는 지금 내 코드는 다음과 같습니다

Select 
    st.Name, 
    st.Date, 
    st.Shift, 
    sl.Sales 
From 
    Shift st 
right join 
    Sales as sl on sl.Name = st.Name 
       and sl.Date = Case 
           When sl.Date = DATEADD(DD, 1, st.Date) 
           Then DATEADD(DD,1, st.Date) 
           Else st.Date 
          End 

단순히 sales.date = shift.date 사용하는 경우에서 누락 된 데이터를 집어 들고, 그러나 또한 중복 데이터의 많은 끝있다. 죄송합니다. 간단하지만 영업 사원이 다음날 근무하지 않았는지 단순히 확인하고 그 사람의 다음 영업 데이터를 이전 날짜에 추가하는 좋은 방법을 파악하지 못했습니다.

편집 : 원하는 결과는 다음과 같이 보일 것이다 :

ShiftDate | Name | Shift | Sales 
01-01-2013 | Dan Smith | Night | 8 
01-02-2013 |John Johnson| Night | 4 
01-03-2013 |John Johnson| Night | 9 

정확한 당 변화 판매량이 100 % 정확하지 않으면 난 정말 상관 없어,하지만 내가 데리러 필요가 않습니다 다음날 영업 데이터가없는 경우 다음날 근무 데이터가 없습니다.

나는이 문제를 절대적으로 해결할 것이므로 잠시 동안 모델 변경을 좋아할 것입니다. 불행히도 판매 데이터는 외부 소스에서 가져온 데이터를 데이터베이스로 가져 와서 현재까지는 정확한 타임 스탬프를 제공하지 못하고 있습니다.

+0

Yakshemash! 너는 이제 더 이상 새로운 것이 아니다. 난 단지 3 개월 동안 SQL을 수행 :) 귀하의 DB는 모든 타임 스탬프를 포함해야합니다. –

+1

원하는 결과를 게시 할 수 있습니까? – Lamak

+1

존 존슨이 판매 한 '01-03-2013' 판매 방법을 어떻게 알 수 있습니까? 당신은'01-03-2013' 교대로 보여주고 있지만, '01-02- 2013' 자신의 규칙에 의해 – Lamak

답변

0

좋아,이 작품 :

;WITH Sales2 AS 
(
    SELECT A.*, CASE WHEN B.[Date] IS NULL THEN 1 ELSE 0 END LastShift 
    FROM Sales A 
    LEFT JOIN Sales B 
     ON A.Name = B.Name 
     AND A.[Date] = DATEADD(DAY,-1,B.[Date]) 
) 
SELECT A.[Date], 
     A.Name, 
     A.Shift, 
     SUM(B.Sales) Sales 
FROM Shift A 
LEFT JOIN Sales2 B 
    ON A.Name = B.Name 
    AND CASE 
     WHEN A.Shift <> 'Night' AND A.[Date] = B.[Date] 
      THEN 1 
     WHEN A.Shift = 'Night' AND B.LastShift = 0 AND A.[Date] = B.[Date] 
      THEN 1 
     WHEN A.Shift = 'Night' AND B.LastShift = 1 AND A.[Date] = DATEADD(DAY,-1,B.[Date]) 
      THEN 1 
     ELSE 0 
     END = 1 
GROUP BY A.[Date], 
     A.Name, 
     A.Shift 

Here is a sqlfiddle을이 솔루션의 데모와 함께.

는 그리고 resuls은 다음과 같습니다

╔═════════════════════════╦══════════════╦═══════╦═══════╗ 
║   Date   ║  Name  ║ Shift ║ Sales ║ 
╠═════════════════════════╬══════════════╬═══════╬═══════╣ 
║ 2013-01-01 00:00:00.000 ║ Dan Smith ║ Night ║  8 ║ 
║ 2013-01-02 00:00:00.000 ║ John Johnson ║ Night ║  4 ║ 
║ 2013-01-03 00:00:00.000 ║ John Johnson ║ Night ║  9 ║ 
╚═════════════════════════╩══════════════╩═══════╩═══════╝ 
0

모델에 문제가 있습니다. 실제 시작일과 종료일을 정의하는 다른 테이블을 정의하는 것이 좋습니다. YOU는 해당 테이블을 사용하여 매출을 올바른 날짜와 해당 시프트에 배치 할 수 있습니다.

+0

경우에만! 판매 데이터는 외부 소스 (묻지 않음)에서 가져온 다음 db로 가져오고 정확한 타임 스탬프를 제공 할 의사가 없거나 기꺼이하지 않습니다. 그것은 몇 달 동안 해결하려고 노력했지만 문제가되지는 않을 것입니다. –

0

더 나은 모델이 필요하다고 생각합니다. 이것이 작동하는지 확인하십시오. 당신이 의도 한대로

SELECT 
    sft.Name, 
    sft.Date, 
    sft.Shift, 
    sum(sls.Sales)  
FROM Sales sls 
LEFT JOIN Shift sft 
    ON sls.Date >= sft.Date 
WHERE (sls.Date = sft.Date OR sls.Date NOT IN 
     (SELECT Date FROM Shift WHERE Date = sls.Date AND Name = sls.Name)) 
GROUP BY 
    sft.Name, 
    sft.Date, 
    sft.Shift 
+0

'Sales'열 이름이 잘못되었습니다. 집계 또는 하위 쿼리가 포함 된 식에서 집계 함수를 수행 할 수 없습니다. –

+0

@BoratSagdiyev 감사합니다. 저는 약간의 변경을했습니다. – NaNey

+0

ON sls.Date> = sft.Sales - 'Sales'열 이름이 잘못되었습니다. –

관련 문제