2017-01-20 12 views
1

再帰的CTEクエリを使用して原価計算書を作成しようとしています。私が実行している問題は、マテリアルパーツの一部のリビジョンを選択する必要がありますが、再帰的なクエリではTOP演算子を使用できないということです。問題に関する詳細情報を提供する :TOPまたはOFFSET演算子は再帰共通テーブル式の再帰部分には使用できません

  • 一部改訂(PartRevテーブル)は、多くの材料(PartMtl表)からなる部品表として有しています。
  • 部品表の材料には、独自の材料を使用することもできます。これを得るには、重要な部分(すでにこれを持っている)とその改訂版が必要です。しかし、マテリアルパーツリビジョンはERPシステムによって記録されません(ERPシステムを開発していないため、これを変更することはできません)。むしろその場で計算され、単一のレコードが選択されます。
  • SQL Serverでは、再帰クエリ内でTOP演算子を使用できないため、1つのリビジョンを選択できません。

私はこれを回避するために何ができるかわかりません。以下は、私が試みたSQLコードです。

あなたはこのように、あなたが参加したサブクエリでそれを使用することができ、この場合、ウィンドウ関数を使用する必要が
WITH CostedBOMFinance AS 
(
select 
    Erp.PartRev.PartNum, 
    Erp.PartRev.RevisionNum, 
    case when Erp.PartMtl.ViewAsAsm = 1 then 'Asm' else 'Mtl' end as MtlType, 
    Erp.PartMtl.MtlSeq as Seq, 
    Erp.PartMtl.MtlPartNum, 
    (
     select TOP(1) Erp.PartRev.RevisionNum 
     from Erp.PartRev as MtlRev 
     where MtlRev.Approved = 1 and 
       MtlRev.PartNum = Erp.PartMtl.MtlPartNum 
    ) as MtlRev, 
    Erp.Part.PartDescription, 
    Erp.PartMtl.QtyPer, 
    Erp.PartMtl.UOMCode, 
    Erp.PartCost.StdBurdenCost, 
    Erp.PartCost.StdLaborCost, 
    Erp.PartCost.StdMaterialCost as StdUnitCost, 
    Erp.PartCost.StdSubContCost, 
    Erp.PartCost.StdBurdenCost + Erp.PartCost.StdLaborCost + Erp.PartCost.StdMaterialCost + Erp.PartCost.StdSubContCost as TotalStdCost, 
    1 as Level 
from Erp.PartRev 
join Erp.PartMtl on Erp.PartMtl.Company = Erp.PartRev.Company and 
        Erp.PartMtl.PartNum = Erp.PartRev.PartNum and 
        Erp.PartMtl.RevisionNum = Erp.PartRev.RevisionNum 
join Erp.Part on Erp.Part.Company = Erp.PartMtl.Company and 
       Erp.Part.PartNum = Erp.PartMtl.MtlPartNum 
join Erp.PartCost on Erp.PartCost.Company = Erp.Part.Company and 
        Erp.PartCost.PartNum = Erp.Part.PartNum 

UNION ALL 

select 
    Erp.PartRev.PartNum, 
    Erp.PartRev.RevisionNum, 
    case when Erp.PartMtl.ViewAsAsm = 1 then 'Asm' else 'Mtl' end as MtlType, 
    Erp.PartMtl.MtlSeq as Seq, 
    Erp.PartMtl.MtlPartNum, 
    (
     select TOP(1) MtlRev.RevisionNum 
     from Erp.PartRev as MtlRev 
     where MtlRev.Approved = 1 and 
       MtlRev.PartNum = Erp.PartMtl.MtlPartNum 
    ) as MtlRev, 
    Erp.Part.PartDescription, 
    Erp.PartMtl.QtyPer, 
    Erp.PartMtl.UOMCode, 
    Erp.PartCost.StdBurdenCost, 
    Erp.PartCost.StdLaborCost, 
    Erp.PartCost.StdMaterialCost as StdUnitCost, 
    Erp.PartCost.StdSubContCost, 
    Erp.PartCost.StdBurdenCost + Erp.PartCost.StdLaborCost + Erp.PartCost.StdMaterialCost + Erp.PartCost.StdSubContCost as TotalStdCost, 
    Level + 1 
from Erp.PartRev 
join Erp.PartMtl on Erp.PartMtl.Company = Erp.PartRev.Company and 
        Erp.PartMtl.PartNum = Erp.PartRev.PartNum and 
        Erp.PartMtl.RevisionNum = Erp.PartRev.RevisionNum 
join Erp.Part on Erp.Part.Company = Erp.PartMtl.Company and 
       Erp.Part.PartNum = Erp.PartMtl.MtlPartNum 
join Erp.PartCost on Erp.PartCost.Company = Erp.Part.Company and 
        Erp.PartCost.PartNum = Erp.Part.PartNum 
join CostedBOMFinance as CostedBOMFinanceParent on CostedBOMFinanceParent.PartNum = Erp.PartMtl.MtlPartNum and 
               CostedBOMFinanceParent.RevisionNum = MtlRev 
) 

select * from CostedBOMFinance 
+0

サブクエリでウィンドウ関数を使用する必要があります。これまでのトップ部分のクエリを表示できますか?ウィンドウの表示方法を教えてください。最初の部分は必要ありません。再帰的な問合せでは、すべて共用体です。 – Hogan

+0

ああ、私は今 "トップ"を参照してください。あなたはどのようにこれがうまくいくと思いますか、あなたは注文しません。 – Hogan

+1

また、テーブルエイリアスの使用を開始する必要があります。選択リストでは3つの部分の名前付けが推奨されていません。 https://technet.microsoft.com/en-us/library/bb510662.aspx –

答えて

2

SELECT 
-- ... 
    MtlRev.RevisionNum, 
-- ... 
from Erp.PartRev 
join (
    select RevisionNum, PartNum, 
     ROW_NUMBER() OVER (Partition By PartNum ORDER BY RevisionNum) AS RN 
    from Erp.PartRev as MtlRev 
    where MtlRev.Approved = 1 
) AS MtlRev ON MtlRev.PartNum = Erp.PartMtl.MtlPartNum and MtlRev.RN = 1 
-- ... 

注:ORDER BY RevisionNum DESCまたは一部を必要とするかもしれませんあなたが言わなかったので、他の注文は完全にわかりません。

関連する問題