(答) select A.ID, A.DATE, A.DATA from TableName A inner join (select ID, max(DATE) as MAX_DATE from TableName group by ID ) B on A.ID = B.ID and A.DATE = B.MAX_DATE ; 0004NAME IS NULL2018/01/04(木) 22:15:39.02ID:??? よくある質問2
(問) key data ---------------- 1 a 1 a 1 b 1 b 1 a 2 b 2 a 2 a
(答) select key, SUM(CASE data WHEN 'a' THEN 1 END) AS a, SUM(CASE data WHEN 'b' THEN 1 END) AS b FROM table GROUP BY key ORDER BY key ; 0005NAME IS NULL2018/01/04(木) 22:16:40.08ID:??? よくある質問3
(問) ID HOGE 01 A 01 B 01 C 02 A 03 B
HOGEをAもBもCも持っている、ID:01だけ取り出すにはどうすればよかですか
(答1) select id FROM TableName WHERE hoge in ('A','B','C') GROUP BY id HAVING count(DISTINCT hoge) = 3 ;
(答2) select * from TableName T1 where not exists (select * from (values 'A', 'B', 'C') T2 (HOGE) where not exists (select * from TableName T3 where T1.ID = T3.ID and T2.HOGE = T3.HOGE ) ) ; ※valuesの部分(Table Value Constructor)はDBMSによって文法がかなり違うので注意 0006NAME IS NULL2018/01/04(木) 22:17:39.88ID:??? よくある質問4
(答) SQLでは存在しないデータを生成することはできません。 この問いの場合は素直にカレンダーテーブルを用意しましょう。 0009NAME IS NULL2018/01/05(金) 02:47:19.49ID:??? よくある質問5
with TEMP (NUM) as ( select 1 from dual union all select NUM + 1 from TEMP where NUM < 31 ) select to_char(to_date('201006', 'YYYYMM') + NUM - 1, 'YYYYMMDD') from TEMP where to_date('201006', 'YYYYMM') + NUM - 1 < add_months(to_date('201006', 'YYYYMM'), 1) ;
※上記はOracleの場合です。(11gR2以降) ※再帰問合せをサポートするDBMSならこれを適当に改変すれば動きますが どのみちお奨めしません。 0010NAME IS NULL2018/01/05(金) 02:49:13.40ID:??? よくある質問5 (後半の訂正)
with TEMP (NUM) as ( select 1 from dual union all select NUM + 1 from TEMP where NUM < 31 ) select to_char(to_date('201006', 'YYYYMM') + NUM - 1, 'YYYYMMDD') from TEMP where to_date('201006', 'YYYYMM') + NUM - 1 < add_months(to_date('201006', 'YYYYMM'), 1) ;
※上記はOracleの場合です。(11gR2以降) ※再帰問合せをサポートするDBMSならこれを適当に改変すれば動きますが どのみちお奨めしません。 0011NAME IS NULL2018/01/05(金) 02:50:38.56ID:??? いちおつ generate_series()関数がダメみたいだな 0012NAME IS NULL2018/01/05(金) 21:56:46.58ID:??? 前スレ971の回答でも貼っとくか
select T5."T3_ID" "ID", T5."T3_日付" "日付", T5."T3_値" "値", T5."T4_日付" "求めたい日付" from (select T3."ID" "T3_ID", T3."日付" "T3_日付", T3."値" "T3_値", T4."T2_日付" "T4_日付", row_number() over (partition by T3."ID", T3."日付" order by T4."T1_日付" desc) "日付順" from "TableName" T3 left outer join (select T1."ID" "T1_ID", T1."日付" "T1_日付", T2."日付" "T2_日付", row_number() over (partition by T1."ID", T1."日付" order by T2."値" desc) "値順" from "TableName" T1 inner join "TableName" T2 on T1."ID" = T2."ID" and T2."日付" between add_months(T1."日付", -12) and T1."日付" ) T4 on T3."ID" = T4."T1_ID" and T3."日付" > T4."T1_日付" where T4."値順" = 1 or T4."値順" is null ) T5 where T5."日付順" = 1 order by 1,2,3 ; 0013NAME IS NULL2018/01/06(土) 14:50:55.67ID:??? なるほど 全然速そうだな 0014NAME IS NULL2018/01/06(土) 15:46:57.99ID:Os9t48kn なんでそんな変なのばっかりなの? ソートが頭から離れないのか。 0015NAME IS NULL2018/01/07(日) 01:11:19.54ID:???>>13 パーティション切ってrow_numberで先頭行だから オプティマイザの出来次第だけどパフォーマンスに大差はないと思うけど 相関サブクエリとjoinなら同じ実行計画はいたりするし
>>14 はいはい どうせ正解は書かないんじゃなくて書けないんでしょ 0016NAME IS NULL2018/01/07(日) 10:01:46.51ID:yu9dE7vj なんというレベルの低さ 0017NAME IS NULL2018/01/07(日) 12:26:12.96ID:??? >全然速そうだな
変な日本語を何とかしろよ 0018NAME IS NULL2018/01/07(日) 14:04:49.83ID:yu9dE7vj>>15 >>3 を見たのか? 0019NAME IS NULL2018/01/25(木) 18:41:52.80ID:heRfYWvO mysqlでサブクエリを asに代入するとき、常に1カラムしかasできないため サブクエリだらけになってしまうのですが、これをスマートに1サブクエリとかで取得できませんでしょうか?
SELECT ( SELECT max(num) FROM sub_table ) as max_num , ( SELECT min(num) FROM sub_table ) as min_num, ( SELECT avg(num) FROM sub_table ) as avg_num FROM main_table ↑main_tableに sub_tableの min max avgを盛り込もうとすると サブクエリだらけになってしまう。 0020NAME IS NULL2018/01/25(木) 19:27:52.27ID:??? これでそのSQLと同じ意味にはなる 何がしたいのかはよくわからんが
select sub.* from (select max(num) as max_num, min(num) as min_num, avg(num) as avg_num from sub_table ) sub cross join main_table ; 0021192018/01/26(金) 09:39:10.20ID:IngnXOhQ>>20 ありがとうございます!! 0022NAME IS NULL2018/01/26(金) 12:43:24.38ID:pxozcjcA 自作自演? 0023NAME IS NULL2018/01/26(金) 17:32:37.75ID:??? どうしてそう思ったの? 0024NAME IS NULL2018/01/26(金) 20:18:17.38ID:??? 感謝ぐらい好きにさせてやれよ歪んでるなあ 0025NAME IS NULL2018/01/28(日) 15:06:04.05ID:Qiu5BIxt 明らかに情報不足なのに情報を補完して回答しているからな。 0026NAME IS NULL2018/01/28(日) 17:13:34.73ID:27cZ5HqG それはキミ、情報不足やない、キミの知識不足やろ。 0027NAME IS NULL2018/01/28(日) 18:21:25.57ID:qkfYCnFE>>26 メインテーブルとサブテーブルの結合条件がクロスジョインとは普通、思わない。 0028NAME IS NULL2018/01/28(日) 18:34:16.20ID:???>>27 > メインテーブルとサブテーブルの結合条件がクロスジョイン え? 0029NAME IS NULL2018/01/28(日) 18:55:59.94ID:???>>19のSQLがクロスジョインだと思えないのは知識不足としか言いようがない 0030NAME IS NULL2018/01/28(日) 19:07:37.13ID:???>>20は何も補完」してないだろ。逆に>>19の意味不明な部分はそのまま字面通り解釈して回答してる。 0031NAME IS NULL2018/01/28(日) 19:16:59.64ID:???>>29 main_table と「sub_table」の cross join だと思ってるなら知識不足以前の話かとww 0032NAME IS NULL2018/01/30(火) 17:05:33.92ID:??? やりすぎ防犯パトロール、特定人物を尾行監視 2009年3月19日19時7分配信 ツカサネット新聞 http://headlines.yahoo.co.jp/hl?a=20090319-00000026-tsuka-soci
「結果」 3 | ccc | 6 | c_key1 4 | ddd | NULL | NULL 0035NAME IS NULL2018/02/04(日) 17:18:13.30ID:???>>33 SQL-Server なら select T.ID as ID, T.NAME as NAME, T.ID2 as ID2, T.DATA as DATA from ( select row_number() over ( partition by TableA.Id order by case TableB.[KEY] when 2 then 0 else 1 end, TableB.[KEY] asc ) as R, TableA.ID as ID, TableA.NAME as NAME, TableB.ID2 as ID2, TableB.DATA as DATA from TableA left join TableB on TableA.ID = TableB.ID ) T where T.R = 1 0036NAME IS NULL2018/02/04(日) 17:38:30.70ID:gIv0OydZ>>35 ありがとうございます 使用しているのはMariaDB 10.1でしたが(書き忘れ失礼しました)、頂いた解答をヒントに試してみます 0037NAME IS NULL2018/02/04(日) 18:26:18.34ID:???>>36 う〜ん、MariaDB使ったことないけど https://mariadb.com/kb/en/library/row_number/ を見るとrow_number()は10.2.0以降でないとダメみたい 10.2.0には上げられないの? 0038NAME IS NULL2018/02/04(日) 18:33:52.86ID:gIv0OydZ>>37 こちらもちょうどそこに行き着いてました バージョンを上げることは可能なので最新版にアップデートして試してみようと思います わざわざ調べて頂き感謝します 0039NAME IS NULL2018/02/14(水) 13:22:57.02ID:??? ☆ 日本の、改憲をしましょう。現在、衆議員と参議院の両院で、 改憲議員が3分の2を超えております。『憲法改正国民投票法』、 でググってみてください。国会の発議はすでに可能です。 平和は勝ち取るものです。お願い致します。☆☆ 0040NAME IS NULL2018/02/15(木) 23:04:18.91ID:??? SQLがなかなか覚えられません SELECT が先頭に来るのは覚えていますが、 次がFROMか、WHEREか迷ったりします なにか覚えやすい方法ってありますか? 0041NAME IS NULL2018/02/15(木) 23:30:33.91ID:??? 暗記 0042NAME IS NULL2018/02/16(金) 00:34:33.15ID:???>>40 順番はきっちり決まってるから覚えれば迷うことはない それすら覚えられないならマやめた方がいい 0043NAME IS NULL2018/02/16(金) 07:59:00.96ID:???>>41-42 ありがとうございます 覚えます 0044NAME IS NULL2018/02/22(木) 17:16:09.65ID:??? 集計で、nullがあれば0で、nullが1つもない場合は最大値や最小値を取ってくるような書き方ってないでしょうか? 0045NAME IS NULL2018/02/22(木) 18:10:39.74ID:???>>44 CASE式で
SELECT c1, CASE (SELECT count( * ) FROM t1 AS a WHERE a.c1 = b.c1 AND c2 IS NULL) WHEN 0 THEN sum(c2) ELSE 0 END FROM t1 AS b GROUP BY c1
設計見なおしたほうがいいパターンだと思う 0046NAME IS NULL2018/02/22(木) 18:30:09.05ID:??? 少し違うやり方だけどこっちのほうがパフォーマンスはいいかも。
SELECT c1, CASE sum(c3) WHEN 0 THEN sum(c2) ELSE 0 END FROM (SELECT c1, c2, CASE WHEN c2 IS NULL THEN 1 ELSE 0 END AS c3 FROM t1) AS t2 GROUP BY c1 ORDER BY c1; 0047NAME IS NULL2018/02/23(金) 10:11:31.58ID:???>>45>>46 ありがとうございます! 後者の方が問い合わせが少ない感じで良さそうですね。 0048NAME IS NULL2018/02/23(金) 21:55:14.87ID:0la0B0YA uelect文を2つ書いてunion allの方がよっぽど可読性が高い。 0049NAME IS NULL2018/02/23(金) 22:08:01.48ID:KWaEL2bi union言いたすぎてuelectになっちゃう奴カワユスw 0050NAME IS NULL2018/02/23(金) 23:22:19.25ID:???>>48 その可読性が高いやつ提示しなよ 0051NAME IS NULL2018/02/24(土) 09:47:28.16ID:??? uelectあるじゃん 0052NAME IS NULL2018/02/24(土) 10:02:55.41ID:??? ウェレクト 0053NAME IS NULL2018/02/24(土) 19:12:40.41ID:Au0dOZ0B セレクト 0 as カラム別名 from テーブル名 group by グループ列名 having 列名 is null union all セレクト max(カラム名) as カラム別名 from テーブル名 group by グループ列名 having 列名 is not null 0054NAME IS NULL2018/02/24(土) 20:27:08.92ID:pUuArQ+S uelectになるのにビビってセレクトになっちゃう奴カワユスw 0055NAME IS NULL2018/02/24(土) 20:41:54.02ID:??? いつもSQL書かずに意味不明なイチャモンだけつけてた人が 珍しくSQL書いたと思ったらやっぱり意味不明なSQLじゃんか havingの意味分かってないんだろうな 0056NAME IS NULL2018/02/24(土) 20:54:00.99ID:pUuArQ+S>>55 おい勘違いするな いつも意味不明なイチャモンつけてるアゲは俺だ アゲだからといってバカと一緒にされては困るなw 0057NAME IS NULL2018/02/25(日) 00:08:49.03ID:??? union all期待してたのに。。。こんな結果なの??