2017-08-22 11 views
1

以下の長い質問に対しては、データベースの構成方法と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に参加させることになります。

リクエストした情報を追加したり削除したりできます。

答えて

2

はあなたにサブクエリを変更してみてください:

SELECT MAX(CAST(TicketDate as DATE)) as MaxTT, 
     JobNo 
FROM TimeTicketDet as tt 
GROUP BY JobNo 

私はあなたの現在のクエリが任意のJobNo

+0

のために複数のMaxTTの日付を返すされなければならないと仮定し、あなたの答えをいただき、ありがとうございます。私はそれを試していたと思って、それは実際に私に最大のTicketDateを与えていないが、私は約5点をチェックして、それは正しい情報を返すようだ。私は約20をさらにチェックし、すべてがチェックアウトした場合、これを答えとしてマークします! –

+0

@RBCKyleBullard YW、ところで、残りのクエリはかなり良いように見えます。あなたが変更する可能性があるのは、可能な限り、最後の 'WHERE/AND'フィルタをサブクエリに移動することだけです。オプティマイザは、クエリをそのように実行するほどスマートでなければなりませんが、おそらくそうではありません。これは、最初からフィルタリングされた結果セットを取得するのではなく、テーブル全体を取得してフィルタリングすることを意味します。 –

関連する問題