X



トップページDB@2ch掲示板
1002コメント316KB
SQL質疑応答スレ 19問目
■ このスレッドは過去ログ倉庫に格納されています
0001NAME IS NULL
垢版 |
2019/05/23(木) 20:25:40.60ID:???
このスレは
「こういうことをやりたいんだけどSQLでどう書くの?」
「こういうSQLを書いたんだけどうまく動きません><」
などの質問を受け付けるスレです。

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

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

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

前スレ:
SQL質疑応答スレ 18問目
https://mevius.5ch.net/test/read.cgi/db/1515071542/
0002NAME IS NULL
垢版 |
2019/05/23(木) 20:29:13.07ID:???
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/
0003NAME IS NULL
垢版 |
2019/05/23(木) 20:31:43.25ID:???
過去スレ
18問目:https://mevius.5ch.net/test/read.cgi/db/1515071542/
17問目:https://mevius.5ch.net/test/read.cgi/db/1468157341/
16問目:http://echo.2ch.net/test/read.cgi/db/1447160858/
15問目:http://peace.2ch.net/test/read.cgi/db/1402919549/
14問目:http://peace.2ch.net/test/read.cgi/db/1371476534/
13問目:http://toro.2ch.net/test/read.cgi/db/1343899481/
12問目:http://toro.2ch.net/test/read.cgi/db/1316769778/
11問目:http://hibari.2ch.net/test/read.cgi/db/1299305530/
10問目:http://hibari.2ch.net/test/read.cgi/db/1274791771/
9問目:http://pc11.2ch.net/test/read.cgi/db/1252492296/
8問目:http://pc11.2ch.net/test/read.cgi/db/1236253554/
7問目:http://pc11.2ch.net/test/read.cgi/db/1223525474/
6問目:http://pc11.2ch.net/test/read.cgi/db/1210940477/
5問目:http://pc11.2ch.net/test/read.cgi/db/1193486961/
4問目:http://pc11.2ch.net/test/read.cgi/db/1176553195/
3問目:http://pc11.2ch.net/test/read.cgi/db/1160458216/
2問目:http://pc8.2ch.net/test/read.cgi/db/1141622643/
帰ってきた:http://pc8.2ch.net/test/read.cgi/db/1124178925/
Part 2:http://pc8.2ch.net/test/read.cgi/db/1103113155/
初代:http://pc8.2ch.net/test/read.cgi/db/1056973582/
0004NAME IS NULL
垢版 |
2019/05/23(木) 20:34:29.61ID:???
よくある質問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
;
0005NAME IS NULL
垢版 |
2019/05/23(木) 20:36:39.27ID:???
よくある質問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
;
0006NAME IS NULL
垢版 |
2019/05/23(木) 20:40:07.78ID:???
よくある質問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によって文法がかなり違うので注意
0007NAME IS NULL
垢版 |
2019/05/23(木) 20:41:16.91ID:???
よくある質問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
0008NAME IS NULL
垢版 |
2019/05/23(木) 20:43:39.42ID:???
よくある質問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ならこれを適当に改変すれば動きますが
 どのみちお奨めしません。
0009NAME IS NULL
垢版 |
2019/05/23(木) 20:44:50.22ID:???
以上、テンプレ終わり
0010NAME IS NULL
垢版 |
2019/05/25(土) 01:14:38.34ID:1nV7ZQjK
空文字列を入れたがるやつにかぎって、レコードによっては空文字列だったり、NULLだったりと両方想定してないといけない設計にして、運用ではまる。
0011NAME IS NULL
垢版 |
2019/05/25(土) 01:39:12.17ID:???
苦労しているんだね
同情します
0012NAME IS NULL
垢版 |
2019/05/25(土) 06:44:36.96ID:LBGwosS9
SQLじゃなくてテーブル設計の質問なんですが、お願いします。

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

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

もとのデータは下のテーブル形式で、夜間処理で照会用の中間テーブルとして上のテーブルをつくればいい
0016NAME IS NULL
垢版 |
2019/05/25(土) 10:08:56.32ID:???
>>15
おっしゃる通りです。経験のなさから、そこまで考えが及びませんでした。
まずは第三正規形に正規化した状態でのパフォーマンス確認からしてみます。
0017NAME IS NULL
垢版 |
2019/05/25(土) 11:34:00.50ID:???
>>12
その商品、特定倉庫1ヶ所にしまうのかい?
0019NAME IS NULL
垢版 |
2019/05/25(土) 13:46:20.37ID:Z+RZPCej
縦横問題はRDBができて以来定番の課題&質問になってるな
PIVOTとかも使いにくいしいい加減DBMS側でうまいことしてほしいところ
0020NAME IS NULL
垢版 |
2019/05/26(日) 00:42:51.61ID:???
今なら
「ラクテンスーパーポイントスクリーン」
登録するだけでRポイント150pが貰える!

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

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

完了

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

現代の常識だとそうなる
0028NAME IS NULL
垢版 |
2019/06/02(日) 23:01:40.17ID:???
ここSQLスレじゃなくなったん?
0030NAME IS NULL
垢版 |
2019/07/13(土) 19:26:52.20ID:AJIqdE5u
今更だが、SQLの正しい記述ってのはあるのか?
0031NAME IS NULL
垢版 |
2019/07/13(土) 20:51:42.24ID:???
今更だが、正しさとはなんだ?
0032NAME IS NULL
垢版 |
2019/07/13(土) 20:54:06.41ID:???
アメリカが正義だ
0035NAME IS NULL
垢版 |
2019/07/14(日) 08:50:25.15ID:KDHP+Bri
>>34
はい。
0037NAME IS NULL
垢版 |
2019/07/29(月) 21:32:16.54ID:???
点数テーブル
名前 日付 点数
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していて複雑なので、文も大分長くなってますしこれでいいのか不安になってます
0038NAME IS NULL
垢版 |
2019/07/29(月) 21:38:08.33ID:???
普通にleftjoinして加算すれば
0039NAME IS NULL
垢版 |
2019/07/29(月) 21:48:46.85ID:???
ありがとうございます!
+で繋げたら普通に足し算できたんですね・・・お恥ずかしい
ゲタのほうに該当がなかった場合点数+NULLみたいにならないか不安ですが試してみます!
0040NAME IS NULL
垢版 |
2019/07/30(火) 00:01:05.07ID:???
COALESCEなりCASEなりでNULLを0にすればいいんでない?
0042NAME IS NULL
垢版 |
2019/07/31(水) 22:15:14.94ID:???
37の意図する事が今一分からないだが、
単純に点数テーブルとゲタテーブルをマージして
Group by して sum取っちゃ拙いのか?

MySQLだとこんな具合で
select `名前`,`日付`,sum(`点数`) from (
select `名前`,`日付`,`点数` from `点数テーブル`
union
select `名前`,`日付`,`点数` from `ゲタテーブル`
) g
group by `名前`,`日付`;
0043NAME IS NULL
垢版 |
2019/07/31(水) 22:32:34.75ID:???
>>37がやってるってのがそれだろ。
しかも>>37は正しくunion all使ってるのにお前は間違えてるし。
0045NAME IS NULL
垢版 |
2019/08/01(木) 08:09:51.16ID:???
まあunionでもいいと思うが万が一ゲタ側のレコードに対応するレコードが点数テーブルにない時もレコード出力されちゃうから俺ならleft joinでやると思う
0046NAME IS NULL
垢版 |
2019/08/01(木) 20:10:22.24ID:???
>>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.日

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

見づらく恐縮なのですが、よろしくお願いします
0047NAME IS NULL
垢版 |
2019/08/01(木) 22:23:33.88ID:???
2番目のgroup by はやばい.
正誤で言えば、1番目が正しい
0049NAME IS NULL
垢版 |
2019/08/02(金) 09:43:54.13ID:???
ありがとうございます!
確かにAはおかしかったですね・・・
@のほうで書いてみたいと思います
ありがとうございました!
0050NAME IS NULL
垢版 |
2019/08/02(金) 22:05:00.81ID:???
サブクエリする必要はないけど
Aも別に間違いじゃないけどな
SELECT 人, 日, 点+SUM(ゲタ)
  FROM 点T
  LEFT JOIN ゲタT
  ON 点T.人 = ゲタT.人
  AND 点T.日 = ゲタT.日
  GROUP BY 人, 日, 点
0051sage
垢版 |
2019/08/03(土) 13:02:52.10ID:wjgyF6r3
>>47
なにがやばくてどう間違ってるのか詳しく

どう書いてもまあいいんだが、気になるなら実際のテーブル(インデックス)構成と件数で実行計画取ってみれ
0052NAME IS NULL
垢版 |
2019/09/01(日) 09:35:29.97ID:???
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のところに入れる方法をお願いします。
0053NAME IS NULL
垢版 |
2019/09/01(日) 16:47:32.11ID:???
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
;
005452
垢版 |
2019/09/01(日) 17:52:32.35ID:???
>>53
大変ありがとうございました。
使わせていただきます。
0055NAME IS NULL
垢版 |
2019/09/20(金) 14:25:08.89ID:???
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
0056NAME IS NULL
垢版 |
2019/09/20(金) 16:17:33.29ID:???
HAVING使うぐらいか?

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

select *
from xxx T1
where exists (
  select *
  from xxx T2
  where T1.name = T2.name
  and T1.datetime <> T2.datetime
)
0059NAME IS NULL
垢版 |
2019/09/21(土) 16:28:13.26ID:???
これはありえないw
0060NAME IS NULL
垢版 |
2019/09/21(土) 17:16:57.39ID:???
テーブルのレコード数が多くてnameのカーディナリティも十分高いなら
一般には>>56より>>58の方が良いだろ。
0061NAME IS NULL
垢版 |
2019/09/21(土) 19:24:27.30ID:8nH6piRt
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
の方が速いかも
0062NAME IS NULL
垢版 |
2019/09/21(土) 20:59:51.16ID:???
日時が同じデータはありえないという条件をいわれてないなら
普通はこんなsqlはかけないわw
0063NAME IS NULL
垢版 |
2019/09/21(土) 21:17:13.99ID:???
> nameとdatetime で主キーとしています。
0064NAME IS NULL
垢版 |
2019/09/21(土) 21:52:58.94ID:???
>>61
環境によるから実際に実行計画をみてみなきゃ確実なことは言えないのはその通りだけど、
そのsqlはサブクエリでfull scan 1回、外側で1回、nameのカーディナリティが高ければ
中間データも大きくなり、しかもJOINにインデックスが使われないときているから、
メモリに入りきらないようなテーブルの場合は極端に遅くなりそう。
0065NAME IS NULL
垢版 |
2019/09/21(土) 22:28:07.41ID:???
nameのカーディナリティが高い場合、>>56>>61では中間データが大きくなり
メモリに乗り切らないことが考えられ、>>58のほうが速い可能性がある。

nameのカーディナリティが低い場合、>>58ではexistsの条件に早くひっかかる
可能性が大きくなり、やはり>>58のほうが速い可能性がある。
0066NAME IS NULL
垢版 |
2019/09/21(土) 22:58:15.28ID:???
>>58は相関サブクエリにインデックスが使われ、datetimeの比較は2エントリ目で
必ず判断がつくから、実のところ速度はカーディナリティにあまり影響されない。
0067NAME IS NULL
垢版 |
2019/09/22(日) 04:36:57.50ID:???
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や環境、実際のデータ、インデックスの追加で変わると思う。
0068NAME IS NULL
垢版 |
2019/09/22(日) 11:03:21.51ID:oC+qLfZI
>>67
素晴らしい。結局最初のであまり問題ないね
最近はよっぽど遅い場合を除いて
意図が分かるように書くのがいい感じよね
0069NAME IS NULL
垢版 |
2019/10/01(火) 22:47:53.79ID:yfemt3Lz
すいません
教えてください…
カラムは2つです(アクセスログです)
IP
CGI

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

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

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

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

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

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

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

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

accessをちょっと齧った程度の感覚ではできそうな気がするのですが
0074NAME IS NULL
垢版 |
2019/10/07(月) 22:08:37.13ID:nrBGAukj
>>72
そういうことをするためにリレーショナルデータベースは存在します。
0075NAME IS NULL
垢版 |
2019/10/08(火) 00:01:01.76ID:???
>>73>>74
ありがとうございます
安心して勉強続けます
0076NAME IS NULL
垢版 |
2019/10/08(火) 00:10:43.96ID:???
得意とか苦手とか、心の内面的な部分はどうSQLにしたら良いだろうね
0077NAME IS NULL
垢版 |
2019/10/08(火) 08:53:23.09ID:???
その人の平均スコアより何%以上良ければそのコースは得意とか、そんなんじゃね?
0078NAME IS NULL
垢版 |
2019/10/08(火) 20:09:49.20ID:???
数字のことはよく知らないけど、そういうのは平均値より偏差値が良いんじゃないの?
0079NAME IS NULL
垢版 |
2019/10/08(火) 21:08:15.53ID:1lB5cEuR
なぜ仕様の話になるのか?
0080NAME IS NULL
垢版 |
2019/10/13(日) 17:00:31.98ID:???
宿泊人数を日毎に集計したい。
テーブル構成は、
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が考えられますか?
0081NAME IS NULL
垢版 |
2019/10/13(日) 18:53:50.12ID:???
>>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
0083NAME IS NULL
垢版 |
2019/10/27(日) 15:00:48.42ID:???
以下の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を先に実行
  Aworld yテーブルの1行目のcontinentの値を見る。
  Bworld xテーブルの1行目のcontinentの値と見比べる。.continentの値が一致していたら、world yのarea の値を抽出する
  Cworld xテーブルのarea の値が、world yのareaより大きければ、world xのcontinent, name, areaを抽出する。
  Dworld yテーブルの2行目を見る・・・(以下行数を進めて繰り返し)


AほかのSQL文

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



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

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

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

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

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

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

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

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

どうすればいいのでしょうか?(´・ω・`)
0091NAME IS NULL
垢版 |
2019/12/24(火) 20:19:09.24ID:joe7BHe1
>>90
おそらく半角の濁点、半濁点が無視さらているのでしょう。

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

エスパーじゃないからわかんねえよ!
0095NAME IS NULL
垢版 |
2019/12/24(火) 22:30:40.39ID:???
many to manyって中間テーブルつかわなあらわせないの?
0096NAME IS NULL
垢版 |
2019/12/24(火) 22:37:11.00ID:???
べつに中間じゃなくてもいいよ。
0098NAME IS NULL
垢版 |
2019/12/25(水) 08:01:52.36ID:???
create table T (
a,
b,
unique(a, b)
)

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

変な仕様だけど、SQL Serverの照合順序を変えることが、SQLの質問なのか?
■ このスレッドは過去ログ倉庫に格納されています

ニューススポーツなんでも実況