X



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

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

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

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

前スレ:
SQL質疑応答スレ 17問目
https://mevius.5ch.net/test/read.cgi/db/1468157341/
0284NAME IS NULL
垢版 |
2018/04/29(日) 19:30:40.63ID:???
学校の宿題みたいな設問だな
0285NAME IS NULL
垢版 |
2018/04/29(日) 19:48:09.61ID:i1PXJR4v
>>282
自分でそういうプログラムを作ればいい。
0286NAME IS NULL
垢版 |
2018/04/29(日) 19:49:09.41ID:i1PXJR4v
>>284
トランザクションデータをトランと略しているあたりから、どこかの会社だろう。
0287NAME IS NULL
垢版 |
2018/04/29(日) 19:49:26.43ID:ccXAu8y/
同姓同名には考慮しなくて良いの?
0288NAME IS NULL
垢版 |
2018/04/29(日) 19:51:35.86ID:i1PXJR4v
>>283
外部キーが社員番号ではなくて名前なのはネタだからか?
0289NAME IS NULL
垢版 |
2018/04/29(日) 22:10:20.38ID:???
>>282
どのぐらいの頻度でSQL使うかわからんけど、こんなのでもいいんかね
insert into habook(id, money, method_id)
select 200, -1000, method_id from method where method_name='ゆうちょ銀行'
0290NAME IS NULL
垢版 |
2018/04/29(日) 22:12:28.42ID:???
>>283
>>58と同じみたいなんだが、いまだにわからないのかw
0291NAME IS NULL
垢版 |
2018/04/29(日) 22:15:33.56ID:???
銀行は銀行名の変更とか合併とかあるから
そういった事も考えないといけない
0292◆YDp73vGOso3d
垢版 |
2018/04/30(月) 03:17:07.21ID:???
お前らはどうしても俺の質問には答えたくないみたいだな
0293NAME IS NULL
垢版 |
2018/04/30(月) 08:36:43.41ID:???
頼み方ってものがあるだろ
ほら言ってみろ
0294NAME IS NULL
垢版 |
2018/04/30(月) 10:55:57.85ID:FupcYnE7
コメントが一杯付いてて良かったじゃないか
0295NAME IS NULL
垢版 |
2018/04/30(月) 14:55:41.60ID:???
下みたいなAテーブル、Bマスタがあって
Aテーブル(トラン)
no 名前 上長名前 日付

Bマスタ
名前 社員番号 適用開始日 適用終了日

【抜き出したい情報】
・Aテーブルに1つもない(名前、上長名前)人員の情報(Bマスタの名前、社員番号)
・Aテーブルの名前、上長名前に1以上トランが発生している人員情報、発生件数(名前、上長名前で分ける)

を抽出したい場合はどうすればよいでしょうか?
0296NAME IS NULL
垢版 |
2018/04/30(月) 14:57:09.24ID:???
>>295
同じ名前の社員がいたとき、どうすれば良いの?
0297NAME IS NULL
垢版 |
2018/04/30(月) 15:03:04.31ID:???
結婚とか離婚して姓名変わったらどうすんだ
0298NAME IS NULL
垢版 |
2018/04/30(月) 17:56:27.86ID:???
もうここしか頼るところがございません。
SQL server7.0が、綺麗にwin10のPCだけつながらなくなりました。
「接続できませんでした。 SQL state'ST100'
SQL server エラー0
[microsoft][ODBC SQL server driver] ログインが時間切れになりました」
と出ます。どうすればいいのでしょうか
0301NAME IS NULL
垢版 |
2018/04/30(月) 19:16:11.68ID:L8ngFuqq
>>298
ああこれはログインが時間切れになってるね
ログインが時間切れにならないように注意しなよ
0303NAME IS NULL
垢版 |
2018/05/04(金) 20:14:40.86ID:???
外部キーって必ず他のテーブルの主キーじゃないとダメなの?
0304NAME IS NULL
垢版 |
2018/05/04(金) 21:31:51.25ID:???
主キーでなくてもUNIQUE制約がついていれば大丈夫だと思う
0305NAME IS NULL
垢版 |
2018/05/04(金) 22:29:19.11ID:GLAEl09j
>>303
>>304
これ自分も知りたいからageてみるか
0306NAME IS NULL
垢版 |
2018/05/05(土) 00:10:26.39ID:T65X27xi
>>303
一意制約の列でもよい。要は重複値を持っている列では外部キー制約に使用できない。
0307303
垢版 |
2018/05/05(土) 01:36:42.07ID:dfGZW7dT
>>304
>>306
ありがとうございますm(_ _)m
0308NAME IS NULL
垢版 |
2018/05/10(木) 23:54:50.05ID:???
DB殆ど触ったことないので分からないのですが、
1. SQLでは[ユーザー名, パスワード, [データA], [データB]] (便宜的にリスト形式にしています)
のようなDB構造は作れるのでしょうか?

つまり、ユーザー名とパスワードは1ユーザに1つずつ、データA,B,C、、、は内部に複数のデータを持つような構造です
ちなみに扱いたいSQLはpostgreSQLです

2. node.jsとpostgreSQLを使ってウェブアプリを作ろうと思っているのですが、postgreSQLでは最初にDB構造の宣言などはしなくて良いのでしょうか?

Swift + RealmでDBを使った際には、ユーザーモデルっていうDB構造?を宣言してから使ったので、少々混乱しています

3. node.jsとpostgreSQL(npmで)をWindowsにインストールしたのですが、postgreSQLが動きませんでした
WindowsにもpostgreSQLをインストールしなければいけないのでしょうか?


よろしくお願いします
0309NAME IS NULL
垢版 |
2018/05/11(金) 03:50:27.46ID:JrURJydT
MySQLです。数値を計算するSQL文ってあるでしょうか?

例えば、rankingテーブルに「access」と「click」というカラムがあるとします。
accessは×1でclickは×5にして、その合計数値が多い値(降順)で表示

みたいなことがしたいです。
0310NAME IS NULL
垢版 |
2018/05/11(金) 05:53:20.74ID:6wqBIw87
>>308
まずはDBを触りましょう
SQLではと書いているということは他ならわかるのでしょうか
RDBでは一般的に
[ユーザーID,ユーザー名,パスワード]
[ユーザーID,データ番号,データ]
のようなテーブルを作成してユーザーIDで結合します
これを正規化といいます

>>309
素直に
order by (ranking.access + ranking.click * 5) desc
でいけるかと
0311NAME IS NULL
垢版 |
2018/05/11(金) 17:09:15.29ID:???
SQL初心者です。
連続して1が立っている時間
(行数、データ数)は求められないでしょうか。
1が出てきたタイミングで後どれだけ続くかをその行に書き込みたいです。
0312NAME IS NULL
垢版 |
2018/05/11(金) 21:47:33.52ID:???
>>310
いけました!orderに計算するって概念がありませんでした。
とても勉強になりました。ありがとうございます
0313NAME IS NULL
垢版 |
2018/05/12(土) 09:16:12.16ID:???
>>311
どういうテーブル、イメージしてるデータの並びを書かないとレスつかないんじゃないか
0314NAME IS NULL
垢版 |
2018/05/12(土) 20:19:54.53ID:???
>>313
ありがとうございます。

A B
0 0
0 0
1 3
1 0
1 0
0 0
0 0

AからBを作りたいです。
Bの3は1が3つ続いていることを意味します。
0315NAME IS NULL
垢版 |
2018/05/12(土) 21:14:06.97ID:???
>>314
順序も規定せずに 「続いてる」とか言われてもなあ
Excel + VBA とかでやれば?
0317NAME IS NULL
垢版 |
2018/05/12(土) 21:39:12.17ID:???
>>315
>>316
No A B
0 0 0
1 0 0
2 1 3
3 1 0
4 1 0
5 0 0
6 0 0
7 1 2
8 1 0
9 0 0

例えばこの様な連番が有れば出来るものでしょうか。

すみません。
SQLで出来るのか?
出来るならどのような方法が有るのか
知りたいです。

よろしくお願いします。
0318NAME IS NULL
垢版 |
2018/05/12(土) 22:16:46.98ID:???
>>317
これで
2 1 3
7 1 2
がとれたらいいわけ?
時間っていってたわりにはそういう結果をかいてないが
0319NAME IS NULL
垢版 |
2018/05/12(土) 22:19:25.26ID:???
あとDBは何かしりたい
0320NAME IS NULL
垢版 |
2018/05/12(土) 22:28:15.77ID:???
最新の(つまりinsertする前の)NoでAが1で、かつ追加するデータのAが0だったら
直前のAが0のデータのNoを見る
例ならNoが9の時に0になったから直前のAが0のデータはNoが6だと。
んで、7,8が連続したものだった
だからNo7のBに2をセット

こんな感じ?
0321NAME IS NULL
垢版 |
2018/05/12(土) 23:17:44.19ID:???
>>318
分かりにくく申し訳ありません。
元々時系列のデータだったので
時間という書き方をしていました。
(何個続いたか知りたいのです)

NOとAの項目がある状態でBの項目
を追加したいと思っています。

318様のような結果でも構いません。

>>319
MSのSQL Serverです。申し訳ありませんが詳細なバージョンなどは不明です。

>>320
ありがとうございます。
書かれているようなことが
実現できればと思います。
0322NAME IS NULL
垢版 |
2018/05/12(土) 23:18:49.98ID:???
>>317
SQL文でやるならレコードを次々と参照しないといけないから再帰SQL使わないとだめだろうな
あるいはプロシージャでカーソル使う
あるいはプログラムでやる感じになる
0323NAME IS NULL
垢版 |
2018/05/13(日) 00:03:02.98ID:???
SQL Serverでなく、MySQLです、済みません。テーブル名はtと仮定しました。

create procedure setB()
begin
 declare done int;
 declare _flag int;
 declare _cnt int;
 declare _a int;
 declare _no int;

 declare cur cursor for select No,A from t order by No desc;
 declare exit handler for not found set done = 0;
 set done = 1;
 set _flag = 0;
 set _cnt = 0;
 
 open cur;
 while done do
  fetch cur into _no, _a;
  if _a = 1 and _no > 0 then
   update t set b = 0 where No = _no + 1;
   set _cnt = _cnt + 1;
  else
   update t set b = _cnt where No = _no + 1;
   set _cnt = 0;
  end if;
 end while;

 if _a = 1 then
  update t set b = 0 where No = _no;
 else
  update t set b = _cnt where No = _no;
 end if;
 close cur;
end;
0324NAME IS NULL
垢版 |
2018/05/13(日) 05:37:55.80ID:???
>>322
ありがとうございます。
教えていただいたキーワードをもとに
調べてみます。

>>323
ありがとうございます。
今はPCをさわれる環境にないので月曜日に試してみたいと思います。
0325NAME IS NULL
垢版 |
2018/05/13(日) 07:21:58.29ID:???
>>322
再帰やストアドなんて要らんでしょ
>>318 の結果を得たいだけなら

select
 T1.NO, T1.A,
 (
  select min(T3.NO) as NO
  from T as T3
  where T1.NO < T3.NO and T1.A <> T3.A
 ) - T1.NO as [連続数]
from T as T1
inner join T as T2 on T1.NO - 1 = T2.NO and T1.a <> T2.a
where T1.A = 1

で十分でしょ (わかると思うけど表名は T ね)
0326NAME IS NULL
垢版 |
2018/05/13(日) 09:51:48.44ID:???
>>325
ありがとうございます。
試してみます。
0327NAME IS NULL
垢版 |
2018/05/13(日) 11:09:02.63ID:???
再帰SQLでやるならこんな感じ
最初に1がでたところで表示したいとのことなので
レコードの最後から加算積み上げてる
半角でレスしようとしたらインジョクションかなんかでエラーになった
ため全角に変換してます

WITH CTE AS (
SELECT NO,A,A AS B 
FROM TBL AS M

UNION ALL 
SELECT M.NO ,M.A ,S.B + 1 AS B −−Bを1で積上げていく
FROM TBL AS M
inner join CTE AS S
on  M.NO = S.NO −1 −−レコードの後ろから参照
and S.A = 1
and M.A = 1

), [WK1] AS (
SELECT NO,A,max(B) as B −−Bが積上開始位置により別々の数字になっているので最大値でサマリー
FROM CTE AS M
GROUP BY NO,A


SELECT M.NO,M.A,case when S.A = 0 then B else 0 end B −−前のレコードがゼロの時のみBを表示
FROM [WK1] AS M
LEFT JOIN TBL AS S
on M.NO −1 = S.NO 
ORDER BY M.NO
0328NAME IS NULL
垢版 |
2018/05/14(月) 10:07:01.26ID:???
>>325
>>327
ありがとうございます。どちらも思ったような結果が得られました。
>>323
ありがとうございます。
今回は動かせていませんが、MySQLをさわる機会に試してみます。

4月末よりSQLを使わなければいけなくなり、困っていました。
皆さんに教えていただいた方法を理解し自由にSQLが書けるよう頑張ります!
0329NAME IS NULL
垢版 |
2018/05/17(木) 11:36:55.43ID:???
教えて下さい。

下記の表Tに於いて
NO,START,STOPが与えられているとき
KEKKAという行を得たいです。
良い方法があれば教えてください。
(STARTからSTOPの間に1を立てたい)
DBはMicrosoft SQL Serverです。

NO START STOP KEKKA
1 0 0 0
2 0 0 0
3 1 0 1
4 0 0 1
5 0 0 1
6 0 1 1
7 0 0 0
8 0 0 0

よろしくお願いします。
0330NAME IS NULL
垢版 |
2018/05/17(木) 15:57:54.69ID:???
>KEKKAという行を得たい

????????
0331NAME IS NULL
垢版 |
2018/05/17(木) 16:33:50.08ID:???
>>330
わかりにくくてすみません。
KEKKAという項目は元のデータにはなく、この項目を生成したいです。
0332NAME IS NULL
垢版 |
2018/05/17(木) 19:41:40.74ID:???
STARTとSTOPは1件ずつしかないのか?

順序はNO順でいいのか?
NOは連番なのか?
0333NAME IS NULL
垢版 |
2018/05/17(木) 22:05:10.46ID:???
START、STOPは必ず1レコードあり、複数はない
って事なら、簡単なSQLで処理できそう
0334NAME IS NULL
垢版 |
2018/05/17(木) 22:12:42.54ID:???
>>332
STARTとSTOPは複数あります。
NO順です。
NOは連番です。
STARTが1である行とSTOPが1である行は必ず交互に来て、
STARTとSTOPが同時に来ることはありません。
STARTが1の行とSTOPが1の行は続くことがあります。
STOPが1の行の直後にSTARTが1の行が来る場合もあります。
STARTが1の行の数とSTOPが1の行の数は同じです。
NO順に先頭から見ていくと、STARTが1の行は、STOPが1の行より先に出現します。

よろしくお願いします。
0335NAME IS NULL
垢版 |
2018/05/17(木) 22:21:17.05ID:???
>>334 で何をやりたいかはだいたいわかったけど
(たぶん STARTしてからSTOPするまで KEKKAを1にすればよいはず)
行順を保持しつつ状態遷移させるのって普通のSQLでできるのだろうか?
0336NAME IS NULL
垢版 |
2018/05/17(木) 22:27:50.57ID:???
START、START、STOP、STOPって並びになったときはどうすんの?
0337NAME IS NULL
垢版 |
2018/05/17(木) 22:28:51.14ID:???
334見てなかった、すまん
0338NAME IS NULL
垢版 |
2018/05/17(木) 22:51:31.55ID:???
>>334
スタートがあったら1加算ストップがあったら1減算する累積計算すればいいじゃねえ
select no sum( start + end * -1) as kekka from t as m
left join t as s
on t.no<=m.no
group by no
0339NAME IS NULL
垢版 |
2018/05/18(金) 01:30:58.99ID:???
>>338
いろいろ細かいミスは置いといて、それSTOPの行が1にならんだろ

>>329
select NO,START,STOP,
(select isnull(sum(START),0) from t where t.NO <= m.NO)-
(select isnull(sum(STOP),0) from t where t.NO < m.NO) KEKKA
from t m
とかで出来んじゃね
0340NAME IS NULL
垢版 |
2018/05/18(金) 10:08:58.76ID:???
ありがとうございます。
皆さんに教えていただいた方法を試していますが、うまく行きそうです。
ありがとうございました。
0341NAME IS NULL
垢版 |
2018/05/18(金) 17:13:55.57ID:???
・DBMS名とバージョン
10.1.16-MariaDB

・テーブルデータ
テーブル:categories
cateid  catename   
----------------
1     c1
2     c2
3     c3
4     c4
5     c5
6     c6
7     c7
8     c8

テーブル:books
cateid  bookname price
--------------------
1     b11     20
1     b12     10
1     b13     30
1     b14     40
1     b15     5
2     b21     20
2     b22     10
2     b23     30
2     b24     40
2     b25     5


・欲しい結果
cateid   catename bookname price
--------------------------------
1     c1      b14     40
1     c1      b13     30
1     c1      b11     20
2     c2      b24     40
2     c2      b23     30
2     c2      b21     20

・説明
categoriesとbooksをcateidで結合。結合の順番はbooksのpriceの降順とし、更にその結合する数の上限を3としたいのですが、どういうSQLになりますか?

ちなみに↓のようなSQLを思いつきましたが上手く行かず・・・
SELECT *
FROM categories
    LEFT JOIN (SELECT * FROM books ORDER BY price DESC LIMIT 3) books
    ON (books.cateid = categories.cateid)
priceでのソートはできてるんですが、LIMITが期待通りには機能しませんでした
まあそれもそのはず・・・これではbooksテーブル全件の上位3件を拾ってこいというクエリですからね
0342NAME IS NULL
垢版 |
2018/05/18(金) 21:21:55.34ID:???
select
 t1.cateid, catename, t1.bookname, t1.price
from books t1
join category c on c.cateid=t1.cateid
where 3 >= (
 select count(*)
 from books t2
 where
  t1.cateid = t2.cateid and
  t1.price <= t2.price
)
order by cateid, price desc;
0343NAME IS NULL
垢版 |
2018/05/20(日) 02:31:03.55ID:???
>>342
できました!ありがとうございます!
0344NAME IS NULL
垢版 |
2018/05/29(火) 11:29:58.81ID:???
table data_pool
code bb_date   baibai  suuryou
111  2018/04/01   3  2000
111  2018/04/03   1  1000
222  2018/04/05   3  1000
222  2018/04/09   3  2000
333  2018/05/01   3  5000

(PK code + bb_date)
baibai 1 売り 3 買い
月単位で集計するときにbaiba=1はマイナスとして集計し
111  2018/04  1000
222  2018/04  2000
333  2018/05  5000
のような結果を得たいのですがどう書けばいい?(mysql)
0345344
垢版 |
2018/05/29(火) 11:31:34.61ID:???
間違い
222  2018/04  3000
です
0346NAME IS NULL
垢版 |
2018/05/29(火) 12:22:53.17ID:x6Mfbf1/
こういう時に間違える人って
0347NAME IS NULL
垢版 |
2018/05/29(火) 12:41:29.95ID:???
おっちょこちょいなんだろうな
> baiba=1
とか書いてるし w
でも、欲しい結果をちゃんと書いてるのはいいことだと思う

MySQLはよく知らんけど
select
code,
date_format(bb_date, '%Y/%d'),
sum(
case baibai
when 1 then -suuryou
when 3 then suuryou
end
)
from data_pool
group by code, date_format(bb_date, '%Y/%d')
とかで行けるんじゃね?
0348NAME IS NULL
垢版 |
2018/05/29(火) 14:04:09.72ID:???
date_format の所、%Y/%m だな。
2カ所直せば大丈夫だろう
0349344
垢版 |
2018/05/29(火) 14:07:06.19ID:???
重ね重ねの間違いお恥ずかしいw
有難うございます
%d を %m にして欲しい結果を得ることが出来ました。感謝
0350NAME IS NULL
垢版 |
2018/05/31(木) 20:59:32.14ID:???
毎日の果物の価格を記録するデータベースを作りたいんですがどういうテーブルをつくったらいいですか?とりあえずitemsテーブルに果物の種類とidのカラムを作ります。
毎日の価格はどういうテーブルにしたらいいですか?
0354NAME IS NULL
垢版 |
2018/05/31(木) 21:21:57.55ID:???
被ってしまった、すまん
0355NAME IS NULL
垢版 |
2018/05/31(木) 21:27:38.54ID:???
>>354
ありがとうございますそっちで聞いてみます、
0356NAME IS NULL
垢版 |
2018/05/31(木) 22:01:13.46ID:???
まあどっちの住人もたいして変わらんからここでも良いとは思うけど
> 毎日の果物の価格を記録するデータベースを作りたいんです
とか意味がわからん
そのデータベースでどう言うことをしたいいのか、とかどういう結果が欲しいのかを書けよ...
0357NAME IS NULL
垢版 |
2018/05/31(木) 22:14:37.43ID:trgN2RKZ
またバカがごねとるw
0358NAME IS NULL
垢版 |
2018/06/01(金) 05:31:44.28ID:VfzZdde5
クリエ通知ってどうやるの?
0359NAME IS NULL
垢版 |
2018/06/06(水) 21:29:03.80ID:???
relatedなカラムにむこうのテーブルにないものをinsertすると勝手に登録してくれますか?
0360NAME IS NULL
垢版 |
2018/06/07(木) 14:54:12.56ID:???
しばらく考えてしまったが
やはり意味が分からなかった
誰か解説頼む
0361NAME IS NULL
垢版 |
2018/06/07(木) 15:10:39.40ID:???
リレーションで外部キーに存在しないものを挿入したら
どうにかしてくれるのかってことだべ
制約にならんと思うんだが、、、トリガで自分で追加するようにすればいけるかもね
0362NAME IS NULL
垢版 |
2018/06/08(金) 03:47:57.75ID:Ywf/F+oU
皆さんがアンケートの答えを格納するテーブルを作るとしたら
未回答は、nullを想定しますか?0を想定しますか?
理由も教えてください!
0364NAME IS NULL
垢版 |
2018/06/10(日) 09:42:21.89ID:???
>>361
on insert cascade か。他のカラムはどうすんだろ
0365NAME IS NULL
垢版 |
2018/06/10(日) 10:20:33.83ID:???
null なり default 値なりにするんだろ
0366NAME IS NULL
垢版 |
2018/06/10(日) 20:58:20.60ID:???
主キーはどうするんだ
0367NAME IS NULL
垢版 |
2018/06/10(日) 21:58:41.22ID:???
>>366
identity とかでいいだろ
てか insert と同じだろ
0368NAME IS NULL
垢版 |
2018/06/14(木) 13:13:32.45ID:???
自動採番のあるテーブルにインサートした場合、その番号を知るには別途selectするものですか?
0369NAME IS NULL
垢版 |
2018/06/14(木) 16:10:12.12ID:???
そもそも自動採番ってSQL標準じゃない気がするし
DBMSによるんじゃね
0370NAME IS NULL
垢版 |
2018/06/14(木) 18:37:24.82ID:???
>>368
普通は採番された番号を取得する機能が提供されてる
でないと単純なログみたいにその番号以外の部分には重複を許す列しかないと検索しようがないから
0371NAME IS NULL
垢版 |
2018/06/15(金) 10:36:36.02ID:???
>>368 です。
自分の使うデータベースで探したらありました。
自動採番ってあるの普通だと思ってたので勉強になりました。
0372NAME IS NULL
垢版 |
2018/06/17(日) 00:34:30.36ID:DF4YrmFv
こういう常時、一人しか使っていないと思っているひとは、なんなんだろうな。
0373NAME IS NULL
垢版 |
2018/06/17(日) 00:58:11.39ID:YrBEhWbQ
こういう常時、で読点打つキチガイはバカなんだろ、うな。
0374NAME IS NULL
垢版 |
2018/06/17(日) 11:52:51.97ID:???
バカだからイミフなんですね
0375NAME IS NULL
垢版 |
2018/06/19(火) 19:16:06.54ID:???
n+1問題ってなんやねん

パフォーマンス低下したら何がいけないの?
0376NAME IS NULL
垢版 |
2018/06/19(火) 19:17:03.49ID:???
何回もデータ分だけ引くの何がいけないの?
ハードが優秀なら別にいいんじゃないないの?
0377NAME IS NULL
垢版 |
2018/06/19(火) 23:22:26.54ID:NrZ3i0Js
それでええんやで
0378NAME IS NULL
垢版 |
2018/06/24(日) 19:08:35.72ID:???
助けてください。自分の力量だと解決できず

データ
日付,オーダ番号,個人名.エラーA,エラーB,エラーC
0601,00001,タナカ,エラーA発生,,
0601,00002,イトウ,,エラーB発生,
0601,00003,サトウ,,,エラーC発生
0602,00004,タナカ,エラーA発生,,
0602,00005,イトウ,エラーA発生,,
0602,00006,スズキ,エラーA発生,,

このとき、個人別にエラー回数の内訳を出したいのです。
個人名, エラー1回目, エラー2回目, エラー3回目,…
タナカ,エラーA,エラーA,,
イトウ,エラーB,エラーA,,
サトウ,エラーC,,
スズキ,エラーA,,

使用DBはMYSQLですがストアドは使えないという制約があり
エラー回数は動的に延ばせればという要望がありますが、5回で止めてもOKです。

よろしくお願いいたします。
0379NAME IS NULL
垢版 |
2018/06/24(日) 21:18:41.09ID:???
select
個人名,
max(case カラム番号 when 1 then エラー end) as エラー1回目,
max(case カラム番号 when 2 then エラー end) as エラー2回目,
max(case カラム番号 when 3 then エラー end) as エラー3回目,
max(case カラム番号 when 4 then エラー end) as エラー4回目,
max(case カラム番号 when 5 then エラー end) as エラー5回目
from (
select
個人名,
case
when not エラーA is null then 'エラーA'
when not エラーB is null then 'エラーB'
when not エラーC is null then 'エラーC'
end as エラー
row_number() over (
partition by 個人名
order by 日付 asc, オーダ番号 asc) as カラム番号
from エラー履歴
)
group by 個人名
0380NAME IS NULL
垢版 |
2018/06/25(月) 19:53:25.00ID:???
よろしくお願いします。
0381NAME IS NULL
垢版 |
2018/06/25(月) 21:07:08.21ID:???
こちらこそよろしくお願いします。
0382NAME IS NULL
垢版 |
2018/06/25(月) 22:01:22.79ID:???
>>379
ありがとうございます!できました!!!
どうしてこんなクエリが思いつくんですか。すげぇですね!
0383NAME IS NULL
垢版 |
2018/06/26(火) 16:30:55.58ID:???
質問です。
tableA
id

tableB
id, A.id

tableC
B.id, col1

のような、A-B-Cと、親-子-孫の関係で、子孫になるほど関連する行が1対多数になっていくテーブルで、

Bの1レコードにたいして、Aの情報と、Cのcol1がnullでない数の情報が欲しいのですが、
LEFT OUTER JOINでどう書けばいいでしょうか?

SELECT t1.x, t2.x, t3.nullでない数
FROM B t1
LEFT OUTER JOIN A t2
ON t1.A.id = t2.id
LEFT OUTER JOIN
(SELECT COUNT(col1) AS nullでない数 FROM C WHERE Bid = t1.id) t3
ON t3.B.id = t1.id

みたいな事がやりたいのですが、クエリはエラーになってしまいます。
■ このスレッドは過去ログ倉庫に格納されています