
SQLite バージョン3.7.10 を使用しています。
以下のサイトにソースがあります。
http://ideone.com/7FPtHL
どう説明するのが適切なのかあまり分かりませんが、
よろしくお願い致します。
t5テーブルにおいて
t2テーブルのt1_key1が't1_key_1' かつ t5テーブルのt3_keyに対応するt3テーブルのt1_keyに対応するt2テーブルのt1_key2の
例えば2012年1月の
(t5テーブルのprofit × その日(t5テーブルのdateの日の部分)に対応した2テーブルのrate)
を
t4テーブルのkeyごとにグループ化してその合計値を高い順に出力したいのですが、
のですがどのようなSQL文を書けば良いのでしょうか?
※
ただし、もしt5テーブルのdateに対応する日付がt2テーブルのdateにない場合は、
t5テーブルのdateに対応する月(年も含めて)のt2テーブルのrateの平均値、
それもない場合は、t5テーブルのdateに対応する年のt2テーブルのrateの平均値、
それもない場合は、t5テーブルの全てのrateの平均値、
を取得してt5テーブルのprofitにかけたいのです。。
※
例えばこのデータなら
2012年1月は
+----------+------+
| t4_name | sum |
+----------+------+
| t4_name_1 |500000|
+----------+------+
| t4_name_2 |150000|
+----------+------+
という結果が得たいです。
t5テーブルのdateの'2012-01-03 00:00:02'の日付に対応するt2テーブルのdateは存在しないので、
t2テーブルの1月(2012-01)のrateの平均値((100+200+300)/3=200)を
profitにかけています。
複雑すぎるというか自分でもうまく説明できないので、
せめて※の部分のSQLの書き方だけでもアドバイス頂けないでしょうか?
A 回答 (2件)
- 最新から表示
- 回答順に表示
No.2
- 回答日時:
select t4.name as t4_name, sum(t5.profit * coalesce(t2.rate, avg(case when date(t5.date, 'start of month') = date(t2.date, 'start of month') then t2.rate else null end), avg(case when date(t5.date, 'start of year') = date(t2.date, 'start of year') then t2.rate else null end), avg(t2.rate)) as sum
from t5 inner join t4 on (t5.t4_key = t4.key) inner outer join t3 on (t5.t3_key = t3.key) left outer join t2 on (t3.t1_key = t2.t1_key2 and date(t5.date) = date(t2.date))
where t2.t1_key1 = 't1_key1' and date(t5.date, 'start of month') = '2012-01-01'
group by t4.key, t4.name
order by sum desc
環境がないのでテストしていませんが、上記のような感じになるとかとおもいます。
(あまり自信はないですが)
あと、何でわかりにくく説明しているの?(T1 とか T2 key とか date とか)
具体的に説明してもらったほうが質問を理解しやすいです。(質問を理解するのに無駄に時間がかかりましたので・・・)
この回答への補足
すいません、訂正です
>「13SQLite error misuse of aggregate function arg()」
「13SQLite error misuse of aggregate function avg()」
>argでエラー
avgでエラー
ご回答ありがとうございます。
すいません、たしかに具体的に書かないと説明が分りづらいですね・・・
自分としてはカラムの名前の付け方などがおかしいと思っているので
かえって混乱させることになると思って、抽象的なt1とかに変換しました。
なるほど、coalesceという関数を利用すれば「もし存在しなければ」が実現できそうですね(ですか?どうだろう)
ただ、実際にそのコードを動かしてみたのですが、
sumの閉じ括弧とinner outerとavgの箇所でエラーがでましたので
sumの閉じ括弧を増やし、inner outerはleft outerに変えたのですが
これは変えても良いのでしょうか?
それとavgなんですが、どうやらsumの中で使うとエラーがでるみたいです・・・
select sum(avg(profit)) from t5;
だけで試してみると、
「13SQLite error misuse of aggregate function arg()」
というエラーがでますので。
これはどのように記述を変えれば良いのでしょうか?
次のコード(sumの閉じ括弧とinner outerの修正済み)だとargでエラーが出る・・・
select
t4.name as t4_name,
sum(t5.profit *
coalesce(
t2.rate,
avg(case when date(t5.date, 'start of month') = date(t2.date, 'start of month') then t2.rate else null end),
avg(case when date(t5.date, 'start of year') = date(t2.date, 'start of year') then t2.rate else null end),
avg(t2.rate)
)
) as sum
from t5
inner join t4 on (t5.t4_key = t4.key)
left outer join t3 on (t5.t3_key = t3.key)
left outer join t2 on (t3.t1_key = t2.t1_key2 and date(t5.date) = date(t2.date))
where t2.t1_key1 = 't1_key1' and date(t5.date, 'start of month') = '2012-01-01'
group by t4.key, t4.name
order by sum desc
No.1
- 回答日時:
ご回答ありがとうございます。
すいません、
自分としては
>
>※
>ただし、もしt5テーブルのdateに対応する日付がt2テーブルのdateにない場合は、
>t5テーブルのdateに対応する月(年も含めて)のt2テーブルのrateの平均値、
>それもない場合は、t5テーブルのdateに対応する年のt2テーブルのrateの平均値、
>それもない場合は、t5テーブルの全てのrateの平均値、
>を取得してt5テーブルのprofitにかけたいのです。。
>※
これをSQLで書くときに外部結合なのか
それともwhere句でのORで繋ぐことなのかがわからないのです・・・
どちらか一方が真なら取ってくるということなんでしょうけど、
その拾い方がわからないというか、、、
そこだけでもアドバイス頂けないでしょうか?
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Access(アクセス) Accessテーブルの結合で別々のテーブルのフィールドを組み合わせて値を出す方法について 2 2022/07/20 19:43
- Oracle sqlで質問です。 aテーブルとbテーブルがあり、下記のsqlで取得したidとnameに一致しないレ 1 2022/04/20 20:34
- MySQL MYSQL エラー 2 2022/10/18 11:37
- CGI perlで書いたcgiでsqliteの使い方を教えてください 2 2023/05/08 21:29
- Ruby pandasでsqlite3にテーブル作成・追加・読み出しでindexの取り扱い方教えてください 5 2023/03/08 09:57
- SQL Server AccessのInsertクエリのあとつづけてDeleteクエリを行いたいがSQLでどう書いたらいい 3 2023/05/27 14:12
- その他(データベース) 更新クエリをリンクデータベーステーブルに実行し実行時エラー3362固有インデックスに重複する値が含ま 1 2022/09/21 11:44
- MySQL PHPとMySQLを使った掲示板の作り方 1 2022/06/02 13:00
- Oracle SQL update方法 2 2022/06/22 14:07
- Oracle sql(oracle)で質問です。 テーブルAのカラム名、日付(yyyymmdd)の値を テーブルB 2 2023/01/06 10:31
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
「テーブルに座って……」という...
-
VBから
-
“There is a fish. ”はおかし...
-
リレーショナル・データベース...
-
phpMyAdminでページが表示できない
-
人数サマリの方法について
-
下記、問題に対しての解答が以...
-
Access2000 のテーブルの...
-
inner joinでサブクエリ
-
お金持ちのテーブル
-
MyODBC-3.51のドライバでの文字...
-
ACCESSで複数のテーブルで同じ...
-
ACCESSクエリで複数テーブルの...
-
0歳~1歳児への英語の教え方
-
テーブルを別ける判断要素をお...
-
スタイルシートのテーブルについて
-
ACCESSでテーブルを更新する時で
-
SQLServerのデータ構造
-
SQLの書き方
-
Access リレーションとデータ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
会社の飲み会の幹事になり、座...
-
「テーブルに座って……」という...
-
下記、問題に対しての解答が以...
-
L2SWはARPテーブルを持っている?
-
外部キーだけのテーブル(主キ...
-
飲み会で、座敷orテーブルどち...
-
テーブルリンク リンク元を知...
-
アクセスのリンクテーブル一覧...
-
男性と2人で飲食店に行きテーブ...
-
複雑なSQL文について
-
お金持ちのテーブル
-
オーダーの覚え方について
-
面接のときテーブルが正面に。...
-
【エクセル】データテーブルの...
-
【MySQL】1対1でテーブルをあ...
-
UTF8のテーブルをODBCドライバ...
-
テーブル(構造)のコピー
-
論理名とコメント構文(?)について
-
取数計算
-
まるいテーブル 円い 丸い 漢字...
おすすめ情報