以下の長い質問に対しては、データベースの構成方法とSQLの知識が不足しているため、すばらしいプレイを得るための唯一の方法です。したがって、データベースにはMAX値が必要なフィールドTicketDate
があります。ただし、datetimeではなくchar(8)変数として定義されています。 MAXを入手するのはMAX(TicketDate as DATETIME)
ほど簡単ではありませんが、実際には最大の日付にはなりません。サブクエリによる重複結果
クエリが独自に動作します:
--***SUB QUERY (TimeTicketDet)
SELECT DISTINCT
cast(TicketDate as DATE) as MAXtt,
tt.JobNo
FROM TimeTicketDet as tt
ORDER BY
cast(TicketDate as DATE) DESC OFFSET 0 ROWS
メインクエリに追加したときしかし、私は各TimeTicketEntryのために重複した行を取得します。最後のサブクエリ(重複なし)なしでクエリが正常に動作します--***SUB QUERY (TimeTicketDet)
。 JobNoはTimeTicketDetテーブルの一意の識別子で、リンクとして使用されました。
DECLARE @now DATETIME
DECLARE @90daysago DATETIME
SET @now = GETDATE()
SET @90daysago = DATEADD(day, -90, @now)
SELECT
o.PartNo,
o.JobNo,
ord.DateEnt,
por.MAXPONum,
po.DateEnt,
tt.MAXtt,
r.ReceiveDate,
CASE
WHEN po.DateEnt >= r.ReceiveDate AND po.DateEnt >= tt.MAXtt THEN cast(po.DateEnt as DATE)
WHEN r.ReceiveDate >= po.DateEnt AND r.ReceiveDate >= tt.MAXtt THEN cast(r.ReceiveDate as DATE)
WHEN tt.MAXtt >= po.DateEnt AND tt.MAXtt >= r.ReceiveDate THEN cast(tt.MAXtt as DATE)
ELSE po.DateEnt
END AS MostRecentDate,
POProrate.TotalCost,
WIPProrate.WIPProrateCost,
(POProrate.TotalCost+WIPProrate.WIPProrateCost) as ProratedCost,
(ROUND(cast((o.QtyToMake - o.QtyShipped2Stock) as FLOAT)/o.QtyToMake,3))*(POProrate.TotalCost+WIPProrate.WIPProrateCost) as TotalProratedCost
FROM
--***MAIN QUERY (OrderDet)***
OrderDet as o
--***SUB QUERY (Order)***
JOIN
(
SELECT
cast(DateEnt as DATE) as DateEnt,
OrderNo
FROM
Orders
) ord
ON ord.OrderNo = o.OrderNo
--***SUB QUERY (POReleases)***
JOIN
(
SELECT
MAX(PONum) as MAXPONum,
JobNo
FROM
POReleases
GROUP BY
JobNo
) por
ON por.JobNo = o.JobNo
--***SUB QUERY (PO)***
JOIN
(
SELECT
PONum,
cast(DateEnt as DATE) as DateEnt
FROM
PO
) po
ON po.PONum = por.MAXPONum
--***SUB QUERY (TimeTicketDet)
JOIN
(
SELECT DISTINCT
cast(TicketDate as DATE) as MAXtt,
tt.JobNo
FROM TimeTicketDet as tt
ORDER BY
cast(TicketDate as DATE) DESC OFFSET 0 ROWS
) tt
ON tt.JobNo = o.JobNo
--***SUB QUERY (Receiver)
JOIN
(
SELECT
rd.JobNo,
cast(MAX(r.ReceiveDate) as DATE) as ReceiveDate
FROM
Receiver as r
INNER JOIN
ReceiverDet as rd ON r.PONum = rd.PONum
GROUP BY
rd.JobNo
) r
ON r.JobNo = o.JobNo
--***SUB QUERY (POProrate)***
JOIN
(
SELECT
j.JobNo,
SUM(j.TotalCost) as TotalCost
FROM
(
SELECT
por.JobNo,
CASE
WHEN pod.Unit = 'LOT' THEN SUM(pod.UnitCost*1)
ELSE SUM(por.Qty*pod.UnitCost)
END as TotalCost
FROM
PODet as pod
INNER JOIN
POReleases as por ON pod.PONum = por.PONum and pod.partno=por.partno
GROUP BY por.JobNo, pod.Unit
) j
GROUP BY j.JobNo
) POProrate
ON o.JobNo = POProrate.JobNo
--***SUB QUERY (WIPProrate)***
JOIN
(
SELECT
j.JobNo,
SUM(j.ProratedCost) as WIPProrateCost
FROM
(
SELECT
tt.StepNo,
tt.JobNo,
tt.ActualPayRate,
tt.BurdenRate,
tt.CycleTime,
tt.SetupTime,
tt.CycleTime + tt.SetupTime as TotalTime,
(tt.CycleTime + tt.SetupTime) * tt.ActualPayRate as LaborCost,
(tt.CycleTime + tt.SetupTime) * tt.BurdenRate as BurdenCost,
((tt.CycleTime + tt.SetupTime) * tt.ActualPayRate) + ((tt.CycleTime + tt.SetupTime) * tt.BurdenRate) as ProratedCost
FROM
TimeTicketDet as tt
) j
GROUP BY j.JobNo
) WIPProrate
ON WIPProrate.JobNo = o.JobNo
WHERE
o.Status = 'Open'
AND o.JobNo <> ''
AND ord.DateEnt <= @90daysago
AND po.DateEnt <= @90daysago
AND tt.MAXtt <= @90daysago
AND r.ReceiveDate <= @90daysago
クエリの目標は、すべての関連の日付を見つける< = 90日齢、リストに追加されます。私が見逃しているのは、最後の日付です。これは、正しいTicketDateをTimeTicketDetテーブルから取り出し、JobNoに参加させることになります。
リクエストした情報を追加したり削除したりできます。
のために複数の
MaxTT
の日付を返すされなければならないと仮定し、あなたの答えをいただき、ありがとうございます。私はそれを試していたと思って、それは実際に私に最大のTicketDateを与えていないが、私は約5点をチェックして、それは正しい情報を返すようだ。私は約20をさらにチェックし、すべてがチェックアウトした場合、これを答えとしてマークします! –@RBCKyleBullard YW、ところで、残りのクエリはかなり良いように見えます。あなたが変更する可能性があるのは、可能な限り、最後の 'WHERE/AND'フィルタをサブクエリに移動することだけです。オプティマイザは、クエリをそのように実行するほどスマートでなければなりませんが、おそらくそうではありません。これは、最初からフィルタリングされた結果セットを取得するのではなく、テーブル全体を取得してフィルタリングすることを意味します。 –