2017-08-03 14 views
-2
SELECT 
     (select CASE 
       WHEN DP_ART_HEAD.KPP_KAT_ART_COD = 'M1' THEN 
        ROUND(DP_ART_LINES.XONDRIKH - DP_ART_LINES.XONDRIKH * DP_ART_LINES.POSOSTO_EKP_PROT/100, 2) 
       WHEN DP_ART_HEAD.KPP_KAT_ART_COD = 'M2' THEN 
        DP_ART_LINES.TIM_MON 
       ELSE 
        DP_ART_LINES.TIM_MON 
       end AS 'NIKOS' 
     FROM DP_ART_LINES 
     JOIN AP_APO_HEAD ON DP_ART_LINES.EID_CODE = AP_APO_HEAD.EID_CODE 
         AND DP_ART_LINES.KPP_APO_CODE = AP_APO_HEAD.KPP_APO_CODE 
     JOIN DP_ART_HEAD ON DP_ART_LINES.RN_DP_ART_HEAD = DP_ART_HEAD.RN_DP_ART_HEAD 
     WHERE DP_ART_LINES.EID_CODE = AP_APO_HEAD.EID_CODE 
    ), 
    DP_ART_HEAD.KPP_KAT_ART_COD, 
    DP_ART_LINES.EID_CODE AS 'Κωδικός', 
    AP_APO_HEAD.EID_PERIGR AS 'Είδος', 
    DP_ART_LINES.POSOT AS 'Ποσότης', 
    DP_ART_LINES.XONDRIKH AS 'Τιμή Χονδρικής', 
    DP_ART_LINES.POSOSTO_EKP_PROT AS 'Έκπτωση', 
    DP_ART_LINES.FL_DORO AS 'Δώρο' 
FROM DP_ART_LINES 
JOIN AP_APO_HEAD ON DP_ART_LINES.EID_CODE = AP_APO_HEAD.EID_CODE 
       AND DP_ART_LINES.KPP_APO_CODE = AP_APO_HEAD.KPP_APO_CODE 
JOIN DP_ART_HEAD ON DP_ART_LINES.RN_DP_ART_HEAD = DP_ART_HEAD.RN_DP_ART_HEAD 

最終結果は場合に選択範囲内を選択し、 "ねじれ"

メッセージ512、レベル16、状態1、行1 サブクエリは複数の値を返しました。 =、!=、<、< =、>、> =、またはサブクエリが式として使用されている場合は、これは許可されません。

どうやら私は単一値受容体のcase文から値の束を押してみようとしています。 これについてもっと良い方法がありますか(もちろんあります)。

+1

、いくつかのサンプルデータを追加、すなわち 'table'を作成し、'誰かが実際にあなたのコードを実行することが可能にする、サンプルデータでinto'挿入し使用していくつかのデータを含めてください。これは、人々がコードをよりよく理解し、よりよくテストできるようにするためです。 また、あなたの期待リターンは?あなたはどんな結果セットを期待しますか? – Cenderze

+2

エラーメッセージは非常に明確で、サブクエリは1つ以上の値を返しました。しかし、サンプルデータや望みの結果がなければ答えにくいですから、質問を編集してそれらを含めるようにしてください。 –

+0

サブクエリのwere句に追加することによって、そのサブクエリを外側のクエリに関連付けることになります。 'WHERE DP_ART_LINES.EID_CODE = AP_APO_HEAD.EID_CODEとDP_ART_LINES.EID_CODE = outerQuery.EID_CODE'のようなものです。ここで、outerQueryは外部クエリのDP_ART_LINESのエイリアスになります – scsimon

答えて

0

サブクエリは複数の行を返すことができます。あなたはトップ1でこれを防ぐことができます。

また、私は外側のselect over selectよりも好きです。

以下のコードを試してください。

SELECT 
    CASE WHEN DP_ART_HEAD.KPP_KAT_ART_COD = 'M1' 
     THEN ROUND(DP_ART_LINES.XONDRIKH - DP_ART_LINES.XONDRIKH * DP_ART_LINES.POSOSTO_EKP_PROT/100, 2) 
     ELSE DP_ART_LINES.TIM_MON 
     end AS 'NIKOS' , 
    DP_ART_HEAD.KPP_KAT_ART_COD, 
    DP_ART_LINES.EID_CODE AS 'Κωδικός', 
    AP_APO_HEAD.EID_PERIGR AS 'Είδος', 
    DP_ART_LINES.POSOT AS 'Ποσότης', 
    DP_ART_LINES.XONDRIKH AS 'Τιμή Χονδρικής', 
    DP_ART_LINES.POSOSTO_EKP_PROT AS 'Έκπτωση', 
    DP_ART_LINES.FL_DORO AS 'Δώρο' 
FROM DP_ART_LINES 
JOIN AP_APO_HEAD ON DP_ART_LINES.EID_CODE = AP_APO_HEAD.EID_CODE 
       AND DP_ART_LINES.KPP_APO_CODE = AP_APO_HEAD.KPP_APO_CODE 
JOIN DP_ART_HEAD ON DP_ART_LINES.RN_DP_ART_HEAD = DP_ART_HEAD.RN_DP_ART_HEAD 
+0

wow。私がどれほど感謝しているかを表現することはできません。私は最終的な答えを望んだが、そのような短い時間で多くの助けはちょうど驚異的である。あなたのご要望に迅速にお応えし、喜んで支援していただきありがとうございます。私は期待されたデータの欠如、私が考慮しなかったという事実にお詫び申し上げます。私の防衛では、これは実際には私がstackoverflowを使用して初めてです。私はより構造化され、将来的にはより多くの研究データを提供するようになるでしょう。それは言われました。 @Peter、あなたの応答は、いくつかの数学的関数のために保存して、問題を完全に解決したスポットにあった。 –

+0

Imは、どのように出力がどのように表示されるはずであるかについてのわかりやすい情報を提供することができないのか確信しています。基本的には、KPP_KAT_ART_COD = 'M1'の場合、DP_ART_LINES.XONDRIKH(小売価格)をDP_ART_LINES.POSOSTO_EKP_PROT(%割引)に等しい割合で減らす必要があります。製品(M1、M2、M3)とシステムは、そのプロファイルに基づいて小売価格を計算する必要があります。それが助けば。コードを実行すると、NIKOS列のすべての行で同じ値が得られます。これは、トップ1が想像しているとおりです。新しい列には、値が割り引かれる必要があります。 –

+0

@ ConstantinosNtikas別の見方は 'WHERE DP_ART_LINES.EID_CODE = AP_APO_HEAD.EID_CODE'です。ここで何をしようとしていますか?あなたはすでに同じことをしている 'ON DP_ART_LINES.EID_CODE = AP_APO_HEAD.EID_CODE'を持っています。同じテーブルを複数回使用する場合は、すべてを使用してください。 – Peter