0

実行したいこのクエリがあります。

 SELECT warehouse.expiry_date, pharmacy.expiry_date,
   drugs.active_substance, 
   drugs.strength, 
   drugs.strength_type, 
   drugs.dosage_form,  
   drugs.minimum_quantity,
   SUM(QTY-QTYQ) as QTYU
 FROM
 (SELECT warehouse.expiry_date, 
   drugs.active_substance, 
   drugs.strength, 
   drugs.strength_type, 
   drugs.dosage_form,  
   drugs.minimum_quantity,
   SUM(warehouse.in_quant)-  SUM(warehouse.out_quant) as QTY
 FROM drugs INNER JOIN warehouse ON drugs.ID = warehouse.drug_id  
 GROUP BY warehouse.expiry_date,
   drugs.active_substance, 
   drugs.strength, 
   drugs.strength_type, 
   drugs.dosage_form, 
   drugs.minimum_quantity

 UNION ALL

 SELECT pharmacy.expiry_date, 
   drugs.active_substance, 
   drugs.strength, 
   drugs.strength_type, 
   drugs.dosage_form,  
   drugs.minimum_quantity,
   SUM(pharmacy.out_quant)-  SUM(pharmacy.out_quant) as QTYQ
 FROM drugs INNER JOIN pharmacy ON drugs.ID = pharmacy.drug_id  
 GROUP BY pharmacy.expiry_date,
   drugs.active_substance, 
   drugs.strength, 
   drugs.strength_type, 
   drugs.dosage_form, 
   drugs.minimum_quantity)
 GROUP BY 
 warehouse.expiry_date,
   drugs.active_substance, 
   drugs.strength, 
   drugs.strength_type, 
   drugs.dosage_form, 
   drugs.minimum_quantity,
  pharmacy.expiry_date;

実行しようとすると、プログラムは pharmacy.expiry_date と QTYQ のパラメーター値を入力したいと考えています。しかし、これらの値はネストされた選択範囲にあります。

何か助けてください。

4

2 に答える 2

0

あなたはホスト変数を持っていないようなので、私のテレパシーは、これはあなたのステートメントにある構文エラーに関連していると言っています. 具体的には、QTYQは存在しないように見え (その名前の列QTYは、 の前の部分の列によってマスクされていますUNION ALL)、選択列の順序を考えると、pharmacy.expiry_dateの間違った場所にあります。GROUP BY最後の減算ステートメント ( SUM(QTY - QTYQ)) は、2 つの異なるを減算しようとしていますが、相関関係を与えていません (実際には列が必要です)。また、誤った結果をもたらすタイプミスもあります ( SUM(pharmacy.out_quant) - SUM(pharmacy.out_quant)0 を返す必要があります。おそらく、必要なものではないはずです。オプティマイザーは、十分にスマートであれば、わざわざ関数を呼び出すことさえしないかもしれません)。

これがあなたのクエリで、より良い形式に書き直されたものです。これはテストされていないことに注意してください。必要に応じて正しい結果が返されることを確認する責任はユーザーにありますまた、 Calendar ファイルも必要になります。

SELECT Calendar.date, 
       Drugs.active_substance,
       Drugs.strength,
       Drugs.strength_type,
       Drugs.dosage_form,
       Drugs.minimum_quantity,
       COALESCE(SUM(InWarehouse.quantity), 0) 
          - COALESCE(SUM(InPharmacy.quantity), 0) as quant
FROM Drugs 
CROSS JOIN Calendar
LEFT JOIN (SELECT drug_id, expiry_date, SUM(in_quant - out_quant) as quantity
           FROM Warehouse
           GROUP BY drug_id, expiry_date) as InWarehouse
ON InWarehouse.drug_id = Drugs.id
AND InWarehouse.expiry_date = Calendar.date
LEFT JOIN (SELECT drug_id, expiry_date, SUM(in_quant - out_quant) as quantity
           FROM Pharmacy
           GROUP BY drug_id, expiry_date) as InPharmacy
ON InPharmacy.drug_id = Drugs.id
AND InPharmacy.expiry_date = Calendar.date
GROUP BY Calendar.date, 
         Drugs.active_substance,
         Drugs.strength,
         Drugs.strength_type,
         Drugs.dosage_form,
         Drugs.minimum_quantity
于 2012-06-06T16:49:08.343 に答える
0
 SELECT InWarehouse.expiry_date, 
        drugs.active_substance,
        drugs.strength,
        drugs.strength_type,
        drugs.dosage_form,
        drugs.minimum_quantity,
        COALESCE(SUM(InWarehouse.quantity), 0) 
           - COALESCE(SUM(InPharmacy.quantity), 0) as quant
 FROM drugs 
 LEFT JOIN (SELECT drug_id, expiry_date, SUM(in_quant - out_quant) as quantity
            FROM Warehouse
            GROUP BY drug_id, expiry_date) as InWarehouse
 ON InWarehouse.drug_id = drugs.id
 LEFT JOIN (SELECT drug_id, expiry_date, SUM(in_quant - out_quant) as quantity
            FROM Pharmacy
            GROUP BY drug_id, expiry_date) as InPharmacy
 ON InPharmacy.drug_id = drugs.id
 AND InPharmacy.expiry_date = InWarehouse.expiry_date
 GROUP BY InWarehouse.expiry_date, 
          drugs.active_substance,
          drugs.strength,
          drugs.strength_type,
          drugs.dosage_form,
          drugs.minimum_quantity
于 2012-06-18T12:54:13.973 に答える