SQL質疑応答スレ 19問目 (506レス)
1-

1 2019/05/23(木) 20:25:40 ID:???
このスレは
「こういうことをやりたいんだけどSQLでどう書くの?」
「こういうSQLを書いたんだけどうまく動きません><」
などの質問を受け付けるスレです。

SQLという言語はISOによって標準化されていますが
この標準を100%実装したDBMSは存在せず、
また、DBMSによっては標準でない独自の構文が
追加されていることもあります。

質問するときはDBMS名を必ず付記してください。

【質問テンプレ】
・DBMS名とバージョン
・テーブルデータ
・欲しい結果
・説明

前スレ:
SQL質疑応答スレ 18問目
2chスレ:db
2 2019/05/23(木) 20:29:13 ID:???
SQL言語リファレンス一覧
Oracle Database
https://docs.oracle.com/cd/E96517_01/sqlrf/index.html
Microsoft SQL Server
https://docs.microsoft.com/ja-jp/sql/t-sql/language-reference
IBM DB2 Database
https://www.ibm.com/support/knowledgecenter/ja/SSEPGG_11.1.0/com.ibm.db2.luw.sql.ref.doc/doc/c0004100.html

PostgreSQL
http://www.postgresql.jp/document/current/html/sql.html
MySQL
https://dev.mysql.com/doc/refman/8.0/en/sql-syntax.html
https://dev.mysql.com/doc/refman/5.6/ja/sql-syntax.html


参考リンク
http://sql.main.jp/index.html
https://www.atmarkit.co.jp/ait/articles/0006/21/news001.html
https://oraclesqlpuzzle.ninja-web.net/
https://www.techscore.com/tech/sql/index.html/
3 2019/05/23(木) 20:31:43 ID:???
過去スレ
18問目:2chスレ:db
17問目:2chスレ:db
16問目:2chスレ:db
15問目:2chスレ:db
14問目:2chスレ:db
13問目:2chスレ:db
12問目:2chスレ:db
11問目:2chスレ:db
10問目:2chスレ:db
9問目:2chスレ:db
8問目:2chスレ:db
7問目:2chスレ:db
6問目:2chスレ:db
5問目:2chスレ:db
4問目:2chスレ:db
3問目:2chスレ:db
2問目:2chスレ:db
帰ってきた:2chスレ:db
Part 2:2chスレ:db
初代:2chスレ:db
4 2019/05/23(木) 20:34:29 ID:???
よくある質問1

(問)
ID | DATE     | DATA
--+----------+-----
1 | 2007-11-11 | aaa
2 | 2007-11-11 | bbb
1 | 2007-11-10 | ccc
3 | 2007-11-12 | ddd
3 | 2007-11-11 | eee
4 | 2007-11-10 | fff
1 | 2007-11-12 | ggg

このようなテーブルから、下記のように

1 | 2007-11-12 | ggg
3 | 2007-11-12 | ddd
2 | 2007-11-11 | bbb
4 | 2007-11-10 | fff

各idに対して最新の1件だけ抽出するSQLの書き方を教えてください。

(答)
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
;
5 2019/05/23(木) 20:36:39 ID:???
よくある質問2

(問)
key   data
----------------
1     a
1     a
1     b
1     b
1     a
2     b
2     a
2     a

というテーブルから

key   a   b
--------------------
1    3   2
2    2   1

というExcelのピボットの様なデータを取得したいのですが、どういうSQLになりますか?
a,bというのは固定なので、仮にcというデータがあっても無視して構いません。

(答)
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
;
6 2019/05/23(木) 20:40:07 ID:???
よくある質問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によって文法がかなり違うので注意
7 2019/05/23(木) 20:41:16 ID:???
よくある質問4

(問)
列の数が可変な問合せはどう書きますか?

(答)
標準SQLでは書けません。
pivotという機能を搭載したDBMSなら一見書けそうですが実はやっぱり書けません。
Oracle 11g以降でpivot xmlというキーワードを使用すれば一応可変っぽくはなります。
が、素直にプロシージャを書くかアプリケーションで処理したほうが良いでしょう。

SQL Serverのpivot(2005以降)
http://msdn.microsoft.com/ja-jp/library/ms177410.aspx

Oracleのpivot(11g以降)
http://download.oracle.com/docs/cd/E16338_01/server.112/b56299/statements_10002.htm#CHDCEJJE
http://www.oracle.com/technetwork/articles/sql/11g-pivot-097235.html
8 2019/05/23(木) 20:43:39 ID:???
よくある質問5

(問)
年月(YYYYMM)を指定し、その年月に対応する年月日を取得したい

 例:201006を指定したら、以下の結果を得たい

   20100601
   20100602
    ・
    ・
    ・
   20100630

(答)
SQLでは存在しないデータを生成することはできません。
この問いの場合は素直にカレンダーテーブルを用意しましょう。

どうしてもやりたければ以下のような方法もなくはないですが、
再帰問合せの本来の使い方ではありません。
やめておくことを強くお奨めします。
(PostgreSQLの連番を生成する関数なら辛うじてセーフかもしれませんが
 賛否の分かれるところでしょう。)

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ならこれを適当に改変すれば動きますが
 どのみちお奨めしません。
9 2019/05/23(木) 20:44:50 ID:???
以上、テンプレ終わり
10 2019/05/25(土) 01:14:38 ID:1nV7ZQjK(1)
空文字列を入れたがるやつにかぎって、レコードによっては空文字列だったり、NULLだったりと両方想定してないといけない設計にして、運用ではまる。
11 2019/05/25(土) 01:39:12 ID:???
苦労しているんだね
同情します
12 2019/05/25(土) 06:44:36 ID:LBGwosS9(1)
SQLじゃなくてテーブル設計の質問なんですが、お願いします。

商品を複数の倉庫に保管するモデリングなんですが、現状は、
----------------------------------------------------------------
pkey | 商品ID | 商品名 | 倉庫1 | 倉庫2 | 倉庫3 | 倉庫4 | 倉庫5 |
----------------------------------------------------------------
という風になって、保管する場所が増えるたびに、倉庫カラムが増える設計になっています。
これは、
-------------------------
pkey | 商品ID | 倉庫番号 |
-------------------------
    |      |   倉庫1  |
-------------------------
    |      |   倉庫2  |
-------------------------
    |      |   倉庫3  |
-------------------------
    |      |   倉庫4  |
-------------------------
    |      |   倉庫5  |
-------------------------

という風にするべきなのでしょうか?
最初の設計だとカラムが増えていくのに対して、この方法だとレコードがとんでもない数になっていくのですが・・・・
13 2019/05/25(土) 07:25:57 ID:???
毎回思うけどレコード増えてなにが困るん?
14 2019/05/25(土) 07:54:17 ID:???
>>13
?もともと1レコードに収まっていたデータを多数のレコードに分割すると、読み取りのパフォーマンスは落ちないでしょうか?
?副作用ですが、正規化することで、正規化前と比べてテーブル数が増える(20倍程度)と、結合で速度が落ちないか?
という点が不安です。
15 2019/05/25(土) 08:54:05 ID:???
>>12
倉庫が増えたら項目増やさないといけなくなるのと
倉庫ごとに数量、単価、金額もちたくなるとさらに項目が増える

もとのデータは下のテーブル形式で、夜間処理で照会用の中間テーブルとして上のテーブルをつくればいい
16 2019/05/25(土) 10:08:56 ID:???
>>15
おっしゃる通りです。経験のなさから、そこまで考えが及びませんでした。
まずは第三正規形に正規化した状態でのパフォーマンス確認からしてみます。
17 2019/05/25(土) 11:34:00 ID:???
>>12
その商品、特定倉庫1ヶ所にしまうのかい?
18 2019/05/25(土) 11:45:54 ID:???
SQL質疑スレでやるよりも、こちらでした方が良いかも

DB設計を語るスレ 10
2chスレ:db

答える人は同じなんだろうけどね
19 2019/05/25(土) 13:46:20 ID:Z+RZPCej(1)
縦横問題はRDBができて以来定番の課題&質問になってるな
PIVOTとかも使いにくいしいい加減DBMS側でうまいことしてほしいところ
20 2019/05/26(日) 00:42:51 ID:???
今なら
「ラクテンスーパーポイントスクリーン」
登録するだけでRポイント150pが貰える!

※Androidアプリのみ
iPhoneユーザーはWeb版から登録のみ可能

登録完了後に表示される招待コ一ドをお持ちですか?のところで
「i9WPjs」
を入力する

完了

祭りだ♪ヽ('∀')メ('∀')メ('∀')ノワッショイ
21 2019/05/26(日) 03:38:10 ID:2BWK9yiY(1)
>>14
あなたは30年前からタイムマシンに乗ってやってきたのですか?
22 2019/05/29(水) 11:13:10 ID:???
>>21
30年前でもその設計はしないと思う
23 2019/05/31(金) 19:07:06 ID:???
たまには30年先から来た人に話を聞いてみたい
24 2019/05/31(金) 23:38:45 ID:5a1yvLIB(1)
>>23
過去には行けるが未来には行けない。これが現代の常識。
25 2019/05/31(金) 23:48:27 ID:???
それだとおかしくなる
26 2019/06/01(土) 00:31:01 ID:bltHuGZw(1)
>>25
逆にだった。時間の流れが遅いところにいると、時間の流れが速いところに戻ったときに未来にたどりつく。
27 2019/06/01(土) 01:34:20 ID:???
現在から過去に行けるなら、未来人が現在に来ることは可能だな

現代の常識だとそうなる
28 2019/06/02(日) 23:01:40 ID:???
ここSQLスレじゃなくなったん?
29 2019/06/03(月) 21:16:01 ID:???
SQLスレですね
30 2019/07/13(土) 19:26:52 ID:AJIqdE5u(1)
今更だが、SQLの正しい記述ってのはあるのか?
31 2019/07/13(土) 20:51:42 ID:???
今更だが、正しさとはなんだ?
32 2019/07/13(土) 20:54:06 ID:???
アメリカが正義だ
33 2019/07/13(土) 21:24:45 ID:???
標準SQLがBNF記法でまとめられてるサイト
https://ronsavage.github.io/SQL/
34 2019/07/13(土) 21:47:23 ID:???
>>30
SQL:2016とかの規格の話?
35 2019/07/14(日) 08:50:25 ID:KDHP+Bri(1)
>>34
はい。
36 2019/07/28(日) 18:04:41 ID:???
https://i.imgur.com/QvQTuqJ.jpg
37 2019/07/29(月) 21:32:16 ID:???
点数テーブル
名前 日付 点数
A  7/27 50
A  7/28 70
B  7/27 80
B  7/28 90

ゲタテーブル
A  7/27 10
A  7/28 -5
B  7/27 -20
B  7/28 5

というような2つのテーブルがあって
点数をプラスマイナスした結果を出力したいのですが、どういうやり方がありますか?
今UNION ALLして、名前と日付をGROYP BYして
点数をSUMで集計しているのですが、これで問題ないでしょうか?

本当は例よりもjoinjoinしていて複雑なので、文も大分長くなってますしこれでいいのか不安になってます
38 2019/07/29(月) 21:38:08 ID:???
普通にleftjoinして加算すれば
39 2019/07/29(月) 21:48:46 ID:???
ありがとうございます!
+で繋げたら普通に足し算できたんですね・・・お恥ずかしい
ゲタのほうに該当がなかった場合点数+NULLみたいにならないか不安ですが試してみます!
40 2019/07/30(火) 00:01:05 ID:???
COALESCEなりCASEなりでNULLを0にすればいいんでない?
41 2019/07/30(火) 06:42:33 ID:???
>>39
isnullつかえば
42 2019/07/31(水) 22:15:14 ID:???
37の意図する事が今一分からないだが、
単純に点数テーブルとゲタテーブルをマージして
Group by して sum取っちゃ拙いのか?

MySQLだとこんな具合で
select `名前`,`日付`,sum(`点数`) from (
select `名前`,`日付`,`点数` from `点数テーブル`
union
select `名前`,`日付`,`点数` from `ゲタテーブル`
) g
group by `名前`,`日付`;
43 2019/07/31(水) 22:32:34 ID:???
>>37がやってるってのがそれだろ。
しかも>>37は正しくunion all使ってるのにお前は間違えてるし。
44 2019/07/31(水) 22:35:57 ID:???
>>43
あ、すまんな、その通りだ
45 2019/08/01(木) 08:09:51 ID:???
まあunionでもいいと思うが万が一ゲタ側のレコードに対応するレコードが点数テーブルにない時もレコード出力されちゃうから俺ならleft joinでやると思う
46 2019/08/01(木) 20:10:22 ID:???
>>37です。皆さんありがとうございます。参考になります
その後、LEFT JOINで書いたのですが、
点T
A 7/30 70
B 7/30 80

ゲタT
A 7/30 +10
A 7/30 -5
B 7/30 -10
というように、ゲタの対応するレコードが1件だけではなかったらしく
普通にLEFT JOINすると
A 7/30 80
A 7/30 65
B 7/30 70
のように複数行になってしまいました

サブクエリでSUMするしかないかなと考えているのですが
以下の2つのやり方でどちらが良いでしょうか?
後者のほうがシンプルで良いかなと思ってます
もしくは、もっと他に良い方法があるでしょうか?

?
SELECT 人, 日, 点+ゲタ計
FROM 点T
LEFT JOIN (
  SELECT 人, 日, SUM(ゲタ)
  FROM ゲタT
  GROUP BY 人, 日
)
ON 点T.人 = ゲタT.人
AND 点T.日 = ゲタT.日

?
SELECT 人, 日, 点+ゲタの合計
FROM (
  SELECT 人, 日, 点, SUM(ゲタ)
  FROM 点T
  LEFT JOIN ゲタT
  ON 点T.人 = ゲタT.人
  AND 点T.日 = ゲタT.日
  GROUP BY 人, 日, 点
)

見づらく恐縮なのですが、よろしくお願いします
47 2019/08/01(木) 22:23:33 ID:???
2番目のgroup by はやばい.
正誤で言えば、1番目が正しい
48 2019/08/02(金) 06:39:22 ID:???
ゲタハカセスギw
49 2019/08/02(金) 09:43:54 ID:???
ありがとうございます!
確かに?はおかしかったですね・・・
?のほうで書いてみたいと思います
ありがとうございました!
50 2019/08/02(金) 22:05:00 ID:???
サブクエリする必要はないけど
?も別に間違いじゃないけどな
SELECT 人, 日, 点+SUM(ゲタ)
  FROM 点T
  LEFT JOIN ゲタT
  ON 点T.人 = ゲタT.人
  AND 点T.日 = ゲタT.日
  GROUP BY 人, 日, 点
51 sage 2019/08/03(土) 13:02:52 ID:wjgyF6r3(1)
>>47
なにがやばくてどう間違ってるのか詳しく

どう書いてもまあいいんだが、気になるなら実際のテーブル(インデックス)構成と件数で実行計画取ってみれ
52 2019/09/01(日) 09:35:29 ID:???
date player score weekAve
2019-09-01 A 80 ?
2019-09-01 B 67 ?
2019-09-01 C 91 ?
2019-08-31 A 78 ?
2019-08-31 B 65 ?
2019-08-31 C 93 ?
2019-08-30 A 81 ?
2019-08-30 B 69 ?
2019-08-30 C 90 ?



というようなデータで、各プレイヤーのその日付段階での
直前1週間の平均scoreをweekAveのところに入れる方法をお願いします。
53 2019/09/01(日) 16:47:32 ID:???
sqliteで作ったので適当になおしてくれ

select tb1.col1,tb1.col2,max(tb1.col3),avg(tb2.col3)
from tb1
left outer join tb1 as tb2
on tb2.col2=tb1.col2
and date(tb2.col1)>=date(tb1.col1, '-7 days')
and date(tb2.col1)<=date(tb1.col1)
group by tb1.col1,tb1.col2
;
54 52 2019/09/01(日) 17:52:32 ID:???
>>53
大変ありがとうございました。
使わせていただきます。
55 2019/09/20(金) 14:25:08 ID:???
name, datetime, comment のテーブルでnameとdatetime で主キーとしています。
nameが重複しているものだけをリストアップするにはどうすればよいでしょうか。

A? 2019/9/20 0:0? AAA1
B? 2019/9/20 0:5? BBB1
C? 2019/9/20 0:5? CCC1
A? 2019/9/20 1:0? AAA2
C? 2019/9/20 1:5? CCC2
A? 2019/9/20 2:0? AAA3

の場合以下を期待します。

A? 2019/9/20 0:0? AAA1
A? 2019/9/20 1:0? AAA2
A? 2019/9/20 2:0? AAA3
C? 2019/9/20 0:5? CCC1
C? 2019/9/20 1:5? CCC2

以下のSQL文で実現できますが、もっとスマートな方法はないでしょうか?

select * from xxx
where name in
(
select name from
(select name, count(*) as cnt from xxx group by name)
where cnt > 1
)
order by name, datetime
56 2019/09/20(金) 16:17:33 ID:???
HAVING使うぐらいか?

SELECT * FROM xxx WHERE name IN
(
SELECT name FROM xxx GROUP BY name HAVING 1<COUNT(*)
)
ORDER BY name, datetime
57 2019/09/20(金) 16:43:23 ID:???
>>56
出来ました!
group by はhaving でしたね。
ありがとうございました。
58 2019/09/20(金) 18:25:52 ID:???
こんなんでいいだろ

select *
from xxx T1
where exists (
  select *
  from xxx T2
  where T1.name = T2.name
  and T1.datetime <> T2.datetime
)
59 2019/09/21(土) 16:28:13 ID:???
これはありえないw
60 2019/09/21(土) 17:16:57 ID:???
テーブルのレコード数が多くてnameのカーディナリティも十分高いなら
一般には>>56より>>58の方が良いだろ。
61 2019/09/21(土) 19:24:27 ID:8nH6piRt(1)
DBMSとデータ量で実測してみないとわからんな。
NoSQL系なら58の方が速そう
RDBなら56を改変して
SELECT L.*
FROM xxx L
JOIN (SELECT name FROM xxx GROUP BY name HAVING 1<COUNT(*)) R
ORDER BY L,name, L,datetime
の方が速いかも
62 2019/09/21(土) 20:59:51 ID:???
日時が同じデータはありえないという条件をいわれてないなら
普通はこんなsqlはかけないわw
63 2019/09/21(土) 21:17:13 ID:???
> nameとdatetime で主キーとしています。
64 2019/09/21(土) 21:52:58 ID:???
>>61
環境によるから実際に実行計画をみてみなきゃ確実なことは言えないのはその通りだけど、
そのsqlはサブクエリでfull scan 1回、外側で1回、nameのカーディナリティが高ければ
中間データも大きくなり、しかもJOINにインデックスが使われないときているから、
メモリに入りきらないようなテーブルの場合は極端に遅くなりそう。
65 2019/09/21(土) 22:28:07 ID:???
nameのカーディナリティが高い場合、>>56や>>61では中間データが大きくなり
メモリに乗り切らないことが考えられ、>>58のほうが速い可能性がある。

nameのカーディナリティが低い場合、>>58ではexistsの条件に早くひっかかる
可能性が大きくなり、やはり>>58のほうが速い可能性がある。
66 2019/09/21(土) 22:58:15 ID:???
>>58は相関サブクエリにインデックスが使われ、datetimeの比較は2エントリ目で
必ず判断がつくから、実のところ速度はカーディナリティにあまり影響されない。
67 2019/09/22(日) 04:36:57 ID:???
PostgreSQL 9.6.11 にて1000000行のデータでEXPLAIN ANALYZEを付けて実行してみた。データは https://ideone.com/WTthGi のようにして作成。
各8回実行し、最初の4回は捨てた。

>>55 PostgreSQLでは副問合せに名前を付けないとエラーになるため AS a を追加
Execution time: 1202.286 ms / 1173.974 ms / 1194.647 ms / 1221.041 ms

>>56
Execution time: 1164.661 ms / 1171.337 ms / 1210.060 ms / 1179.993 ms

>>58 order by name, datetimeを追加
Execution time: 2350.302 ms / 2320.161 ms / 2345.047 ms / 2368.932 ms

>>61 R の後にON L.name=R.nameを追加、ORDER BYの,を.に変更
Execution time: 1248.337 ms / 1215.495 ms / 1222.694 ms / 1222.818 ms

↑はDBや環境、実際のデータ、インデックスの追加で変わると思う。
68 2019/09/22(日) 11:03:21 ID:oC+qLfZI(1)
>>67
素晴らしい。結局最初のであまり問題ないね
最近はよっぽど遅い場合を除いて
意図が分かるように書くのがいい感じよね
69 2019/10/01(火) 22:47:53 ID:yfemt3Lz(1)
すいません
教えてください…
カラムは2つです(アクセスログです)
IP
CGI

複数種類あるCGIに対してどのCGIに
このIPからは何回、このIPからは何回アクセスされたというのを集計したいのですが
SQLが思いつきません…
だれか教えてください…
70 2019/10/01(火) 23:20:09 ID:???
>>69
一旦各CGIがLogに出力して
日替わりや週替わり月替わりで集計したらどうか
71 2019/10/02(水) 09:28:22 ID:???
>>69  select CGI,IP,count(*) from テーブル group by CGI,IP;
72 2019/10/07(月) 18:48:19 ID:???
Windowsでデータベースを使いたく、今xamppをインストールして、PHPから学んでる最中なのですが、
mySQL(実際はMariaDB)で作ろうと考えていたのですが、私の目的のデータベースが作れるのか、調べてもなかなか出てこなくて、
ひょっとすると、リレーショナルデータベースでは出来ないのでは?と薄く疑問に思ってるのですが、、以下のデータベースを作ることは可能でしょうか?

例えば、プロゴルフ選手権のデーターベースを作るとします

選手の個人的な情報が入ったテーブル
(名前、生年月日、プロ登録年月日、所属チーム、性別等)

ゴルフコースの情報が入ったテーブル
(コース所在地、ホール数、ホールごとの距離、パー数、運営会社、プレイフィー、年次ごとの改修履歴等)

長年に渡るゴルフツアーの大会日程のテーブル
(カレンダー、使われたコース、個人成績、各順位の賞金額、賞金総額、スポンサー等)

このようなデータを連携させて、
ゴルフツアーのテーブルの個人成績の項目に個人データのテーブルとリレーションシップを張り、
ゴルフツアーのテーブルの開催コースの項目にコースのテーブルとリレーションシップを張り、

このデータベースを使って、例えば、
◯◯選手の年次ごとのツアー成績
◯◯選手の獲得賞金学の推移
◯◯選手のコース全長に対する成績傾向
特定のコースを得意とする選手
チームとして得意なコースか苦手なコースか

などの分析用のデータとして取り出したりすることは出来るものでしょうか?

accessをちょっと齧った程度の感覚ではできそうな気がするのですが
73 2019/10/07(月) 21:35:07 ID:???
できる
74 2019/10/07(月) 22:08:37 ID:nrBGAukj(1)
>>72
そういうことをするためにリレーショナルデータベースは存在します。
75 2019/10/08(火) 00:01:01 ID:???
>>73>>74
ありがとうございます
安心して勉強続けます
76 2019/10/08(火) 00:10:43 ID:???
得意とか苦手とか、心の内面的な部分はどうSQLにしたら良いだろうね
77 2019/10/08(火) 08:53:23 ID:???
その人の平均スコアより何%以上良ければそのコースは得意とか、そんなんじゃね?
78 2019/10/08(火) 20:09:49 ID:???
数字のことはよく知らないけど、そういうのは平均値より偏差値が良いんじゃないの?
79 2019/10/08(火) 21:08:15 ID:1lB5cEuR(1)
なぜ仕様の話になるのか?
80 2019/10/13(日) 17:00:31 ID:???
宿泊人数を日毎に集計したい。
テーブル構成は、
ID(主キー)、チェックイン日、チェックアウト日、人数
(id, startdate, enddate, guests)

以下のデータがあるとき、
1, 2019/10/1, 2019/10/7, 4
2. 2019/10/2, 2019/10/3, 1
3, 2019/10/10, 2019/10/20, 2

2019/10/1:4人
2019/10/2:5人
2019/10/3:4人
2019/10/7:0人
2019/10/10:2人
2019/10/20:0人

このように、変化がある時点のみを抽出したいのですが、
どのようなSQLが考えられますか?
81 2019/10/13(日) 18:53:50 ID:???
>>80
SQL-Server
select dates.date1 as date1, sum(coalesce(table1.guests, 0)) as guests
from table1
right join (
select startdate as date1 from table1
union
select enddate as date1 from table1
) dates on table1.startdate <= dates.date1 and dates.date1 < table1.enddate
group by dates.date1
order by dates.date1
82 2019/10/14(月) 13:54:43 ID:???
>>81
ありがとうございました。
83 2019/10/27(日) 15:00:48 ID:???
以下のURLのSQL練習サイトで勉強しているのですが
調べてもわからなかった問題があるので押してください。

■意味がわからなかった問題
https://sqlzoo.net/wiki/SELECT_within_SELECT_Tutorial/ja
の7番目、各大陸で最大

■問題の正解を出すSQL文

SELECT continent, name, area FROM world x
WHERE area >= ALL
(SELECT area FROM world y
WHERE y.continent=x.continent
AND area>0)

■教えていただきたい点

?SQLの解釈順序

 どのように上のSQLが解釈されているのか順を教えてください。
 
 こういう風に教えてくださいますと助かります。※以下の実行順は、私が考えたのですが、何かがおかしい感じがします・・・

  ?()内のSQLを先に実行
  ?world yテーブルの1行目のcontinentの値を見る。
  ?world xテーブルの1行目のcontinentの値と見比べる。.continentの値が一致していたら、world yのarea の値を抽出する
  ?world xテーブルのarea の値が、world yのareaより大きければ、world xのcontinent, name, areaを抽出する。
  ?world yテーブルの2行目を見る・・・(以下行数を進めて繰り返し)


?ほかのSQL文

 上の自己相関サブクエリと、以下のSQLで何か違いがあれば教えてください。
 (例えば、以下のSQLの場合、件数が数万件に及ぶと実行速度が極端に遅くなる等)
 select continent,name,area from world where area in (select max(area) from world group by continent)  



よろしくお願いいたします。

 
84 2019/10/28(月) 00:43:36 ID:6SIOZDZ3(1)
>>83
解釈としてはxとyの突き合わせだが
DBMSによってどう最適化するかは異なるから
実際は実行計画を見てみるしかない。
そのサイトの裏側が何だかわからないので手元で実行計画を見てみるといい
https://www.atmarkit.co.jp/ait/articles/0408/25/news101.html
85 2019/10/31(木) 02:56:13 ID:taiLajBl(1)
>>83
簡潔に指摘するとALL句の意味を取り違えています。

ALL句の副問い合わせは同じ大陸内の国ごとの面積を返します。

area >= ALL は (area >= 面積1 AND area >= 面積2 AND area >= 面積3) のようなものです。つまりこの場合は一番大きい面積とarea列値を比べることになります。

あなたが考えた処理方法では、?はともかく?〜?を行っていまうと、最大の国だけでなく、同じ大陸の他のレコードまで取得してしまいます。
86 2019/11/09(土) 06:00:59 ID:???
table1 親品番,子品番
table2 品番,品名

取り出したい内容
親品番,親品名,子品番,子品名

table1,2のjoinでON句に親品番=品番や子品番=品番とすると片方ずつは取得できますが、両方同時に取得することはできますか?
87 2019/11/09(土) 08:41:59 ID:???
table1ひとつにtabl2をふたつJOINしてやればいいんだよ
88 2019/11/09(土) 10:19:33 ID:???
>>87
ありがとうございます
週明けに試してみます
89 2019/11/09(土) 11:12:26 ID:af/bSZEC(1)
いかにも初心者らしい質問ですね
90 2019/12/24(火) 16:02:18 ID:???
SQL Server 2014です。

文字列検索で、半角濁音および半角半濁音を含むかどうか調べたいです。
ただ普通に LIKE '%゙%' と検索すると全件ヒットしてしまいます。
照合順序で区別をしてもダメでした。

どうすればいいのでしょうか?(´・ω・`)
91 2019/12/24(火) 20:19:09 ID:joe7BHe1(1/3)
>>90
おそらく半角の濁点、半濁点が無視さらているのでしょう。

まずは自分が見ている濁点、半濁点の文字コードを調べてください。
92 2019/12/24(火) 20:55:24 ID:???
照合順序なにでやってだめだったんだよ
バイナリ系のやつならいける気がするけど
93 2019/12/24(火) 21:29:38 ID:joe7BHe1(2/3)
キャラクタセットも自分で調べないようでは話にならない。
94 2019/12/24(火) 21:31:04 ID:joe7BHe1(3/3)
条件が半角カタカナ文字だったらどうなるのか書いてくれよ。

エスパーじゃないからわかんねえよ!
95 2019/12/24(火) 22:30:40 ID:???
many to manyって中間テーブルつかわなあらわせないの?
96 2019/12/24(火) 22:37:11 ID:???
べつに中間じゃなくてもいいよ。
97 2019/12/24(火) 22:53:42 ID:???
どうやんの?
98 2019/12/25(水) 08:01:52 ID:???
create table T (
a,
b,
unique(a, b)
)

これがaとbのmany to many
99 2019/12/25(水) 09:58:53 ID:???
>>92
ありがとうございます。
照合順序で、てっきりCS・AS・KS・WSしか頭に入ってませんでした。
BINで判別できました。
100 2019/12/25(水) 10:09:08 ID:H+1gr7tn(1/2)
マイク製品は大文字、小文字、全角、半角文字を同じのみなすからなあ。

変な仕様だけど、SQL Serverの照合順序を変えることが、SQLの質問なのか?
1-
あと 406 レスあります
スレ情報 赤レス抽出 画像レス抽出 歴の未読スレ AAサムネイル

ぬこの手 ぬこTOP 0.515s*