TransWikia.com

SQLのHAVINGを副問い合わせとWHERE文を使って表したい

スタック・オーバーフロー Asked by zunda on September 1, 2021

以下のHAVINGを使って条件を書いているところをWHEREを使って表してみたいです。
可能ですか?

SELECT 費目, MAX(出金額) AS 最大出金額 FROM 家計簿アーカイブ GROUP BY 費目 HAVING AVG(出金額) >= 5000;

自分で考えたものがこちらです。

SELECT 費目, MAX(出金額) AS 最大出金額 FROM 家計簿アーカイブ WHERE 5000 <= (SELECT AVG(出金額) FROM 家計簿アーカイブ GROUP BY 費目)  GROUP BY 費目 ;

One Answer

下記のSQLのように副問い合わせで費目を限定することで目的を達成することができます。

SELECT 費目, MAX(出金額) AS 最大出金額
FROM   家計簿アーカイブ SRC
WHERE  5000 <= (SELECT AVG(出金額)
                FROM 家計簿アーカイブ TEMP
                WHERE SRC.費目 = TEMP.費目)
GROUP BY 費目;

@zunda さんが考えたSQLは、費目が複数ある場合は副問い合わせで複数の値が返ってくるのでエラーになります。

テーブル作成例

CREATE TABLE 家計簿アーカイブ(日付 DATE, 費目 VARCHAR(20), メモ VARCHAR(100), 入金額 INTEGER, 出金額 INTEGER); 
-- 表示される
INSERT INTO 家計簿アーカイブ VALUES('2012-12-25','hoge','',0,4000);
INSERT INTO 家計簿アーカイブ VALUES('2012-12-25','hoge','',0,6000);
-- 平均出金額5000未満なので表示されない
INSERT INTO 家計簿アーカイブ VALUES('2012-12-25','fuga','',0,1000);
INSERT INTO 家計簿アーカイブ VALUES('2012-12-25','fuga','',0,1000);
INSERT INTO 家計簿アーカイブ VALUES('2012-12-25','fuga','',0,7000);
INSERT INTO 家計簿アーカイブ VALUES('2012-12-10','給料','11月の給料',280000,0);
INSERT INTO 家計簿アーカイブ VALUES('2013-01-10','給料','12月の給料',280000,0);

SQL Fiddle

Correct answer by payaneco on September 1, 2021

Add your own answers!

Ask a Question

Get help from others!

© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP