0

各スタッフの保留額の合計を取得しようとしています。以下のクエリは正常に機能します。

SELECT SUM(amount) 
FROM pending
WHERE MONTH < DATE_SUB(curdate() , INTERVAL 1 MONTH) 
GROUP BY class

しかし、それをサブクエリとして追加しようとすると、以下のエラーが表示されます:

1242 - サブクエリが複数の行を返す

SELECT
  (period_diff(date_format(now(), '%Y%m'),
     date_format(MONTH, '%Y%m'))) AS months,
  pending.amount,
  pending.admission_numb,
  pending.month,
  staff.name,
  staff.class, (
    SELECT SUM(amount) 
    FROM pending
    WHERE MONTH < DATE_SUB(curdate(), INTERVAL 1 MONTH) 
    GROUP BY class
  )
FROM
  pending JOIN staff
  ON pending.admission_numb = staff.admission
GROUP BY admission
ORDER BY CAST( staff.class AS UNSIGNED ) , staff.class

どんな助けでも大歓迎です..

4

2 に答える 2

1

サブクエリは複数の行を返すため (クラスごとに行が返されることを期待しています)、from 句でサブクエリを結合する必要があります。

SELECT
  (period_diff(date_format(now(), '%Y%m'), date_format(MONTH, '%Y%m'))) AS months,
  pending.amount,
  pending.admission_numb,
  pending.month,
  staff.name,
  staff.class,
  sums.tot
FROM
  pending JOIN staff ON pending.admission_numb = staff.admission
  JOIN  (
    SELECT class, SUM(amount) as tot 
    FROM pending
    WHERE MONTH < DATE_SUB(curdate(), INTERVAL 1 MONTH)
    GROUP BY class
  ) sums on staff.class = sums.class
GROUP BY admission
ORDER BY CAST( staff.class AS UNSIGNED ) , staff.class
于 2012-11-25T18:03:52.657 に答える
0

本当に簡単です。サブクエリは 1 行のみを返すことができます。それがエラーメッセージが教えてくれることです。あなたが指定したクエリは、おそらく複数の行を返します (実際には、各クラスに 1 行)。あなたは出力を提供していないので、これは本当だと推測することしかできません.

これを修正するには、そのクエリを変更して 1 行を返す必要があります。おそらく、 を取り除くGROUP BYか、最大 (または最小) の合計を選んでそれを返します。ビジネス要件に基づいて決定します。

于 2012-11-25T17:56:34.697 に答える