2012-03-01 11 views
0

あなたは私が解決することができません。このSQLの問題で私を助けることを願って:SQL TOP 1問題という記録が見つからないとき

私はこのような項目番号ごとに複数のエントリとの価格リストファイルを持っている:

  • ITEMNO
  • にValidFrom
  • ValidTo
  • 価格

今日、有効な価格でリストを生成しようとすると、次の文を使って適切なレポートを取得します。有効な価格が見つからない場合、つまり今日はレコードがない場合にのみ問題が発生します。この場合、最初のTOP 1サブクエリはまだ(ランダム?)値を返し、レポートを破棄します。

私は、TOP 1は常に定義によって1つの値を返すと仮定しますか、これを防ぐためのトリックがありますか?

本当にありがとうございます。あなたが要求したデータセットが空の場合

SELECT 
    MITBAL.MBITNO as 'Artikel', MITMAS.MMITDS as 'Bezeichnung', 
    MITBAL.MBBUYE as 'Disponent', MITMAS.MMNEWE as 'Gewicht', 
    MITBAL.MBSUNO as 'Lieferant', MMITTY as 'Typ', 
    m9ucos as 'Std.-Kosten', idsunm as 'Lieferantenname', 
    iicucd as 'WSL', MBEOQT as 'EOQ', 

    (select count(*) 
    from RCE12_Staging.dbo.mpagrl 
    left outer join RCE12_Staging.dbo.mpagrh on aicono = ahcono 
              and aiagnb = ahagnb and aisuno = ahsuno 
    where aicono = 2 
    and aiobv1 = mbitno and aisagl = 20 
    and aisuno between '400000' and '599999' and aigrpi = 40 
    and aiuvdt >= CONVERT(char(8), GETDATE(), 112) and ahpast = '40') as 'Anz.Lief', 

    (select TOP 1 ajpupr 
    from RCE12_Staging.dbo.mpagrp 
    left outer join RCE12_Staging.dbo.mpagrh on ajcono = ahcono 
          and ajagnb = ahagnb and ajsuno = ahsuno 
    left outer join RCE12_Staging.dbo.mpagrl on ajcono = aicono 
          and ajagnb = aiagnb and ajsuno = aisuno 
    where ajcono = 2 
    and ajobv1 = mbitno and ajsuno = mbsuno 
    and ajmapr = 1 and ajgrpi = 40 
    and ajfvdt < CONVERT(char(8), GETDATE(), 112) and ahpast = '40' 
    and ahfvdt < CONVERT(char(8), GETDATE(), 112) 
    and ahuvdt >= CONVERT(char(8), GETDATE(), 112) 
    and aisagl = 20 and aigrpi = 40 
    and aifvdt < CONVERT(char(8), GETDATE(), 112) 
    and aiuvdt >= CONVERT(char(8), GETDATE(), 112) 
    order by ajfvdt desc) as 'EK-Preis', 

    (select TOP 1 ajfrqt 
    from RCE12_Staging.dbo.mpagrp 
    left outer join RCE12_Staging.dbo.mpagrh on ajcono = ahcono 
          and ajagnb = ahagnb and ajsuno = ahsuno 
    left outer join RCE12_Staging.dbo.mpagrl on ajcono = aicono 
          and ajagnb = aiagnb and ajsuno = aisuno 
    where ajcono = 2 and ajobv1 = mbitno 
    and ajsuno = mbsuno and ajmapr = 1 and ajgrpi = 40 
    and ajfvdt < CONVERT(char(8), GETDATE(), 112) and ahpast = '40' 
    and ahfvdt < CONVERT(char(8), GETDATE(), 112) 
    and ahuvdt >= CONVERT(char(8), GETDATE(), 112) and aisagl = 20 
    and aigrpi = 40 
    and aifvdt < CONVERT(char(8), GETDATE(), 112) 
    and aiuvdt >= CONVERT(char(8), GETDATE(), 112) 
    order by ajfvdt desc) as 'EK-Menge' 

FROM 
    RCE12_Staging.dbo.MITBAL MITBAL 
left outer join 
    RCE12_Staging.dbo.MITFAC MITFAC ON mbcono = m9cono and mbitno = m9itno and m9faci = 'DFP' 
left outer join 
    RCE12_Staging.dbo.MITMAS MITMAS ON mbcono = mmcono and mbitno = mmitno 
left outer join 
    RCE12_Staging.dbo.CIDMAS CIDMAS ON mbcono = idcono and mbsuno = idsuno 
left outer join 
    RCE12_Staging.dbo.CIDVEN CIDVEN ON mbcono = iicono and mbsuno = iisuno 

WHERE 
    MITBAL.MBCONO = 2 
    AND MITBAL.MBWHLO = '200' AND MBSTAT = '20' AND MBPUIT = '2' 
    and MBITNO like '479200222%' 

ORDER BY MBITNO 
+2

へようこそStackOverflow:コード、XML、またはデータサンプルを投稿する場合、**これらの行をテキストエディタで強調表示し、エディタツールバーの[コードサンプル]ボタン( '{}')をクリックしてくださいフォーマットと構文はそれを強調する! –

+0

この文を実行しても「TOP 1」を削除すると結果が表示されますか?もしそうなら、問題はあなたの質問であり、「TOP 1」ではありません。 – Fermin

+2

また、問題が発生していることを示す最小限のクエリに**問題を減らしてください**。これらのWHERE条件とSELECT TOP 1サブクエリの10個のサンプルをすべて必要としません - **問題を表示するように減らしてください - 読みにくいそうした膨大なクエリをダンプしないでください私たちに...... –

答えて

0

「トップ1が」1が空のデータセットを返します先頭その後、データセットから最初の行を返します(と...クエリでドイツ語を言い訳してください)行がなく、「ランダムデータ」もありません。

クエリの後半にデータを必要とする場合や、変数を初期化して使用する必要がある場合は、返される行の数を確認してください。

+0

おかげで、あなたは正しい方向に私を指差した。問題は解決しました。 –

関連する問題