特定のルールに基づいて納期を計算する効率的な MySQL クエリの作成に問題があります。PHP ソリューションの方が効率的であれば、それも受け入れます。まだまだ勉強中ですので、お手柔らかにお願いします。
これが私のJobsテーブルです:
ジョブ表:
+--------------+
| Field |
+--------------+
| Job_ID |
| Customer_ID |
| Rep_ID |<- Used for Filtering
| Premium |<- Tinyint(1) (0 by default, 1 if Premium)
| Due_Date |
| Ship_Date |
+--------------+
時間通りの配達を計算するためのルールは次のとおりです。
*Working Day = Weekdays (I would like to exclude holidays but for now, let's just go with all Weekdays)
Rule 1: (Simple) If a Job is of the Premium Type:
Ship_Date before Due_Date = Early
Ship_Date same as Due_Date = On Time
Ship_Date after Due_Date = Late
Rule 2: (Complex) If a Job is of the Standard Type:
Ship_Date before Due_Date minus 2 Working Days = Early
Ship_Date within Due_Date minus 2 Working Days and Due_Date plus 1 Working Day = On Time
Ship_Date after Due_Date plus 1 Working Day = Late
Example:
Due_Date=Nov 9, 2012 and Premium=0
if Ship_Date is Nov 1, 2012 then Status is Early by (4) Days
if Ship_Date is Nov 6, 2012 then Status is Early by (1) Day
if Ship_Date is Nov 7, 2012 then Status is On Time
if Ship_Date is Nov 12, 2012 then Status is On Time
if Ship_Date is Nov 13, 2012 then Status is Late by (1) Day
if Ship_Date is Nov 20, 2012 then Status is Late by (6) Days
希望するレポート形式の例: ヘッダーで早期、定刻、および遅延ジョブの数を取得しようとしています。ご注文は発送日までです。
On Time Delivery Report
October (Early: 1 / On Time: 2 / Late: 0)
+------+-----------+---------+----------+-----------+-----------+------+--------+
| Job #| Cust Name | Premium | Due_Date | Ship_Date |Qty Shipped|Status|DaysDiff|
+------+-----------+---------+----------+-----------+-----------+------+--------+
<List all jobs shipped in October>
November (Early: 0 / On Time: 3 / Late: 0)
+------+-----------+---------+----------+-----------+-----------+------+--------+
| Job #| Cust Name | Premium | Due_Date | Ship_Date |Qty Shipped|Status|DaysDiff|
+------+-----------+---------+----------+-----------+-----------+------+--------+
<List all jobs shipped in November>
誰かが私に解決策を提案できますか? その場合、MySQL または PHP にほとんどの作業を任せるべきですか? 上記のルール 1 と 2 も考慮に入れるエレガントなソリューションを探しています。
パフォーマンスを向上させるために、時間通りの配達ステータスと日差をテーブルとストアに非正規化する必要がありますか? 長い投稿で申し訳ありません。まだまだ勉強中ですが、アドバイスをいただければ幸いです。