私はSQLにかなり慣れていないので(約9か月)、SQL Server2012を使用してこの問題を理解しようとして困惑しています。
次のような2つのテーブルを一致させようとしています。
表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以降の売上データが失われます。翌日にシフトがあるかどうかを確認し、シフトしていない場合は、翌日の売上データを前日の売上に追加する方法を探しています。
現在、私のコードは次のようになっています。
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%正確でなくてもかまいませんが、翌日にシフトがない場合は、翌日の売上データを取得する必要があります。
この問題を完全に修正し、しばらくの間モデルの変更に取り組んでいるので、モデルの変更が大好きです。残念ながら、販売データは外部ソースから取得され、データベースにインポートされます。これまでのところ、正確なタイムスタンプを提供することを望まない/不可能でした。
わかりました、これは意図したとおりに機能します。
;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
これは、このソリューションのデモを含むsqlfiddleです。
そして結果は次のとおりです。
╔═════════════════════════╦══════════════╦═══════╦═══════╗
║ 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 ║
╚═════════════════════════╩══════════════╩═══════╩═══════╝
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加