サブクエリの使い方と注意点
- サブクエリを使った集計処理の結果を表示する方法について解説します。
- サブクエリの使い方や注意点を説明し、具体的な例を示します。
- サブクエリを正しく使うためには、テーブルの関係性やデータの種類を理解することが重要です。
- ベストアンサー
サブクエリについて
サブクエリが上手く行きません、何が間違ってるのでしょうか? select IODate, (select sum(Price) as "収入" from dailyio where IO='収入' group by IODate) , (select sum(Price) as "支出" from dailyio where IO='支出' group by IODate) from dailyio group by IODate; dailyio------------------------------------- フィールド名 型 Code bigint(20) IODate date IO varchar(255) Koumoku varchar(255) Syousai varchar(255) Memo text Price bigint(20) ----------------------------------------------- ご多忙中とは存じますが宜しくご教授お願いします。
- koutake001
- お礼率36% (8/22)
- MySQL
- 回答数2
- ありがとう数3
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
サブクエリするなら外部結合でしょうね ただサブクエリ使わなくてもできます たとえば SELECT IODate ,SUM(IF(IO='収入',PRICE,0)) AS 収入 ,SUM(IF(IO='支出',PRICE,0)) AS 支出 FROM dailyio group by IODate とか SELECT IODate ,SUM((IO='収入')*PRICE) AS 収入 ,SUM((IO='支出')*PRICE) AS 支出 FROM dailyio group by IODate とか
その他の回答 (1)
- yambejp
- ベストアンサー率51% (3827/7415)
外部結合ならこんな感じでいけるのかな SELECT DISTINCT D.IODate,収入,支出 FROM dailyio as D INNER JOIN (SELECT IODate,SUM(PRICE) AS 収入 FROM dailyio WHERE IO='収入' GROUP BY IODate) AS I1 ON D.IODate=I1.IODate INNER JOIN (SELECT IODate,SUM(PRICE) AS 支出 FROM dailyio WHERE IO='支出' GROUP BY IODate) AS I2 ON D.IODate=I2.IODate パフォーマンスを考えればもうちょっとチューニングが必要かも
補足
回答ありがとうございます 試してみたところ ERROR 1064: You have an error in your SQL syntax. になりました・・・ん~~何でだろう・・・
関連するQ&A
- Delphiでサブクエリは可能か
Delphiいやプログラム初心者のものなのですが 困っていますのでどなたか回答願えればと思っております。 Delphiではサブクエリを発行することはできないのでしょうか? 色々試してみてるのですが、「キーワードが無効です'('」のような エラーが出てしまいます。 例えば以下のような場合 SELECT 日付,商品No,商品名,SUM(仕入数) AS 仕入数,SUM(売上数) AS 売上数 FROM ( SELECT siire_date AS 日付,goods_code AS 商品コード,goods_name AS 商品名,SUM(vol) AS 仕入数,0 AS 売上数 FROM SiireData WHERE siire_date >= '2006/05/01' AND siire_date < '2006/06/01' GROUP BY siire_date ,goods_code ,goods_name UNION ALL SELECT delivery_date AS 日付,goods_code AS 商品コード,goods_name AS 商品名,0 AS 仕入数,SUM(vol) AS 売上数 FROM URIAGEDATA WHERE delivery_date >= '2006/05/01' AND delivery_date < '2006/06/01' GROUP BY delivery_date ,goods_code ,goods_name ) サブクエリが無理であれば、一時テーブルを利用しようと考えているのですが・・・わかりません。 Delphi Ver5.0を使って開発しています。 DBはDatabaseDesktop?を利用 どちらの回答でも結構ですのでご教授よろしくお願いします。
- ベストアンサー
- その他(プログラミング・開発)
- in (サブクエリ) わかんない
table hh; +------+ | id | +------+ | 1 | | 2 | | 3 | | 2 | | 1 | | 1 | +------+ select id,count(*) as cou from hh group by id having count(*) in (1,2,3); こいつはOK select id,count(*) as cou from hh group by id having count(*) in (select count(*) from hh group by id); こいつはダメ 違いはなんですか、教えて下さい
- 締切済み
- MySQL
- サブクエリに関して()
$sql2 = 'SELECT ki,id,name,day,tday,st FROM tim WHERE (ki,name,day,st) IN (SELECT ki,name,day,max(st) FROM tim WHERE (ki,name,day) IN (SELECT ki,name,MAX(day) FROM tim where ki='.$_SESSION['ki'].' GROUP BY id) group by id)' ; IDごとにカラムday,stの最大値を出力するもです。(以前おしえていただきました) これに更にsvの最大値も条件にいれたい場合どうしたらいいでしょうか?;
- 締切済み
- PHP
- 金額の計算方法
以下のようなテーブルがあります。 hiduke | syuusi | tekiyou | kingaku | bikou 2007-5-8 | 収入 | 給料 | 48000 | バイト代 (以下数十件続く) このテーブルから、次のようにして収入と支出の5月分の合計を求めました。 select syuusi,sum(kingaku) from suitoh_table where hiduke like '2007-5-%' group by syuusi; syuusi | sum 収入 | 61000 支出 | 15080 するとこのように表示されるのですが、ここからさらに「収入-支出」と計算するにはどうすればいいのでしょうか? 最初のselect文の段階で、収入-支出の計算までさせたいのですが・・・。
- ベストアンサー
- PostgreSQL
- サブクエリ:各カテゴリ内で最大の番号を持っている
各カテゴリ内で最大の番号を持っているものの詳細を表示したいと思っていますが、以下のクエリではエラーがでてしまいます。 SELECT * FROM favorite WHERE no = (SELECT max(no) AS max_no FROM favorite GROUP BY category) 何が悪いのでしょうか?ぜひアドバイスをお願いします。
- ベストアンサー
- MySQL
- Mysql サブクエリの使い方
table_A ---+------ id | count ---+------ 1 | 5 ---+------ 2 | 6 ---+------ 3 | 7 ---+------ table_B ---+----- id | sub_count ---+----- 1 | 2 ---+------ 2 | 2 ---+------ 3 | 5 ---+------ 1 | 3 ---+------ 2 | 4 ---+------ このようなテーブルで table_Aのcountと、table_Bのidでまとめたsub_countの合計が 一致しないidだけを抽出するために、 SELECT table_A.id FROM (SELECT sum(table_B.sub_count) FROM table_B GROUP BY table_B.id) AS B, table_A, table_B WHERE table_A.id = table_B.id AND table_A.count != sum(table_B.sub_cout) と書いてみましたが、うまくいきません。 ERROR 1111 (HY000): Invalid use of group function 何が悪いのでしょうか? mysqlも投稿も初心者です。 よろしくお願いします。
- ベストアンサー
- MySQL
- 複数の副問合わせにて、一つだけデータがない場合の対処法は?
テーブルの各区分に応じて、数量を個々に集計するSQLを作成しております。 そして以下のようなSQLを作りました。 SELECT TBLA.SURYO_1 ,TBLB.SURYO_2 , TBLC.SURYO_3 ,TBLD.SURYO_4 FROM (SELECT SUM(SURYO) AS SURYO_1 FROM TEST_TABLE WHERE TEST_KUBUN = '1' GROUP BY SURYO) TBLA, (SELECT SUM(SURYO) AS SURYO_2 FROM TEST_TABLE WHERE TEST_KUBUN = '2' GROUP BY SURYO) TBLB, (SELECT SUM(SURYO) AS SURYO_3 FROM TEST_TABLE WHERE TEST_KUBUN = '3' GROUP BY SURYO) TBLC, (SELECT SUM(SURYO) AS SURYO_4 FROM TEST_TABLE WHERE TEST_KUBUN = '4' GROUP BY SURYO) TBLD しかし、この方法ですと、区分'1','2','4'はデータがあるのに対して、区分'3'は データがないことにより、SQLを実行すると、対象データがないという結果となります。 当然個別にSQLを実行すればよいですが、速度的に4回もSQLを実行するのは効率悪いので、 出来れば一回で行いたいのですけど、区分'3'がデータがなくても、他の3つの区分のデータ を取得する方法はありますでしょうか? よろしくお願いします。
- ベストアンサー
- その他(データベース)
- MySQL SELECT結果をSET
質問は二つあります。 (1)二つのコードをひとつにしたいのですが、どうもうまくいきません SELECT id, (price * 10) FROM table WHERE id = 1; SET @sum = @sum + (SELECT ( SELECT id, (price * 10) FROM table WHERE id = 1); (2)コードの簡略化 SELECT id, (price * 10) FROM table WHERE id = 1 OR id = 3 OR id = 8; の、WHERE id = 1 OR id = 3 OR id = 8; の部分です。 よろしくお願いします。
- ベストアンサー
- MySQL
- サブクエリの使い方
Table t1には t1code|t1type ------------------ 花子|1 太郎|1 一郎|2 次郎|2 五郎|2 Table t2には t2code|date ----------------- 太郎|2012-05-30 太郎|2012-05-30 花子|2012-05-10 花子|2012-05-10 次郎|2012-03-20 五郎|2012-04-10 一郎|2012-03-01 と登録されている場合に t1type毎に一番新しいdateをもつt2codeを抽出したいのです。 そこで、 select t2code,max(date) from t1 inner join t2 on t1code = t2code where (t2code,date) in (select t2code,max(date) as d from t2 group by t2code) group by t1type としたところ、 +--------+------------+ | t2code | max(date) | +--------+------------+ | 太郎 | 2012-05-30 | | 次郎 | 2012-04-10 | +--------+------------+ となります。 本来は、次郎→五郎になってほしいのですが、 どこが悪いのでしょうか? よろしくお願いします。
- ベストアンサー
- MySQL
- SQLの書き方を教えて!
select name,SUM(kingak) from where date between 150221 and 150320 group by frjpc.trcd のようにSUMで集計を行うSQLを発行する時に,同時にkingak順にsortすることは可能なのでしょうか? select name,SUM(kingak) from where date between 150221 and 150320 group by frjpc.trcd order by SUM(kingak) としたいところですが,これではエラーになりますね。 SQLでは解決できないんでしょうか?
- ベストアンサー
- その他(データベース)
お礼
,SUM(IF(IO='収入',PRICE,0)) AS 収入 を ,SUM(IF(IO='収入',PRICE,0)) AS "収入" にしたら行けました!!! ありがとうございます!!
補足
回答ありがとうございます 二つとも試してみたのですが ERROR 1064: You have an error in your SQL syntax. になってしまいます、 原因が解らないです><