SQL質疑応答スレ 14問目at DB
SQL質疑応答スレ 14問目 - 暇つぶし2ch916:NAME IS NULL
14/05/05 06:15:42.31
>>915
ごめん。意味がわかった。正の集合の連続数。負の集合の連続数ということか。>>915は取り消し。

917:NAME IS NULL
14/05/05 06:19:21.91
>>916
すみません。またまた訂正。正の一つだけを含む連続した組と負の一つだけを含む連続した組にそれぞれ連続数を与える。ですね。

918:896
14/05/05 09:31:00.17
>>914

Lag関数を使うと歯抜け日数に対応することが出来ないと思っていたのですが、row_number()関数からの自己結合でうまくいくのですね!!勉強になります。
ただ、Lag関数の3つ目の引数0は何を意味するのですか?PostgreSQL9.3では対応していないようです。

再帰部分が理解不能なので良く見て勉強させて頂きます。
ありがとうございました。

919:NAME IS NULL
14/05/05 09:46:18.85
>>918
lagの2個目がステップ、3個目は初期値
PostgreSQLで対応してるよ

920:896
14/05/05 09:47:51.48
>>917
はぁ~~、なるほど、そういう風に考えるのですか!??

直前の行の自己出力列を比較して連続数として+1するようなイメージだったのですが……

921:896
14/05/05 09:58:47.74
>>919
わ、わかりました!?……動きました。
ふぅ~…、むずかしいな…。
SELECT句の中で比較演算子が使えるのも初めて知りました!!
ありがとうございました。

922:NAME IS NULL
14/05/05 10:43:01.00
そのレベルじゃ自分で書けないSQL使っても後で苦労するぞ
と書いてみる

923:NAME IS NULL
14/05/05 15:29:58.19 tGrX0Jlt
質問失礼します。
たとえば文字列(VARCHAR2)で定義された計算式(足し算や掛け算など)から、
計算結果を取得するにはどうすればいいでしょうか?

924:NAME IS NULL
14/05/05 15:32:45.34
>>923
アプリ側でやったら?

925:NAME IS NULL
14/05/05 15:37:32.29 tGrX0Jlt
>>924
私sql developerを使用しているのですが
計算式が書いてあるテキストを読み込んで
その読み込んだ式の計算結果を取得したのですがTO_NUMBERでは
演算子があると使えないので悩んでいます。

926:NAME IS NULL
14/05/05 15:39:16.54 tGrX0Jlt
>>925
誤 式の計算結果を取得したのですが
生 式の計算結果を取得したいのですが

927:NAME IS NULL
14/05/07 11:13:07.70
eval関数作るしか、、、

928:NAME IS NULL
14/05/07 23:04:05.11
一旦アプリ側で読み出して動的SQL組み立てて流せばいいような。
セキュリティは気をつけなきゃだけど。

929:NAME IS NULL
14/05/08 08:45:23.13
>>923
アプリ側でeval
DB側でfunction定義してeval

930:NAME IS NULL
14/05/08 18:46:33.88
長文失礼postgreSQLです
たとえばですがある大会で1位3P・2位2P・3位1P・4位以下は0Pという風な加点があって
それぞれのチームの競技結果がデータとしてあるとします

というわけでテーブル
・競技結果
順位,チームコード,競技コード
・加点
順位,得点
・チーム
チーム名,チームコード

このとき大会後の各チームの総得点とチーム名を出力させたいわけですが0点のチームがうまく出せません

select チーム名, sum(得点) as 総得点
from (チーム join 競技結果 using (チームコード)) join 加点 using (順位)
where 順位 <= 3
group by チーム名, チームコード

こうすると総得点が0点のチームはチーム名すら出なくなってしまうわけですが上手い方法はありませんか?
超初心者なため色々とツッコミどこがあるかと思いますがなるべく単純にお願いします

931:NAME IS NULL
14/05/08 19:15:59.03
>>930
外部結合(OUTER JOIN)使え
SUM(NULL)はNULLだから、NULLを0に置き換えるのも必要かもしれん

932:NAME IS NULL
14/05/08 19:47:01.05
select チーム名, coalesce(総得点, 0) as 総得点
from チーム
left join (
select チームコード, sum(得点) as 総得点
from 競技結果
left join 加点 using (順位)
where 順位 <= 3
) 総得点テーブル using (チームコード)
group by チーム名, チームコード

933:NAME IS NULL
14/05/25 17:19:45.43 cvRaurYJ
2chはファイルシステムベースでログを管理しているようだけどデータベースシステムを採用していないのは何故ですか?
管理上RDBMS使った方が良さそうな感じがするのですが

934:NAME IS NULL
14/05/27 19:46:39.54 NCmL9RH7
直った?

935:NAME IS NULL
14/05/28 01:49:19.70
・DBMS名とバージョン Oracle11gR2
PL/SQLのプログラムを作ってるのですが期待通り動作しておらず、その理由を知りたく思ってます

テーブルA
a1 | a2
---------
100 | 1
100 | 2
200 | 3
というテーブルにて、a1='100'のレコードについては、a2に100を加算、といった処理をしたく思っており、
以下のようなPL/SQLのプログラムを作りました

set serveroutput on
declare
cursor c1 is SELECT A1, A2 FROM A WHERE A1='100';
aa1 number;
aa2 number;
aa3 number;
sql1 varchar2(1000);
begin
open c1;
loop
fetch c1 into aa1, aa2;
exit when c1%NOTFOUND;
aa3:=100;
-- NG
-- sql1:='UPDATE A SET A2=A2+:3 WHERE A1=:1 AND A2=:2';
-- execute immediate sql1 using aa1, aa2, aa3;
-- OK
sql1:='UPDATE A SET A2=A2+100 WHERE A1=:1 AND A2=:2';
execute immediate sql1 using aa1, aa2;
if (SQL%FOUND) then
dbms_output.put_line('updated');
end if;
end loop;
commit;
end;
/
exit

ここでコメントに「OK」と「NG」とありますが、「OK」部のようにSQLに「A2=A2+100」と記述して
execute immediateすると期待通り動作するのですが、「NG」部のように「A2=A2+:3」と
バインド変数を使うと、エラーは出ないけど、何かの処理もされてない、という状態となります
execute immediate後にsqlcodeやsqlerrmを見ても、エラー類も出力されていません

なぜ「NG」部のような書き方だと、うまくいかないのでしょうか?

また、最終的には後者のようなバインド変数を使ったコードにしたく思っているのですが、
バインド変数を使っても前者のように動作させる方法はありますか?

936:NAME IS NULL
14/05/28 05:59:39.08
PL/SQLってこのスレの範疇か?

>>935
バインド変数は名前に関係ないから
:3,:1,:2に対してaa1,aa2,aa3の指定だと
:3=aa1
:1=aa2
:2=aa3
って展開されてると思われ
結局whereに一致する条件がないから何も更新されない

つかこれ、この程度でPL/SQL使う必要ないよな。例として上げてるだけ?


最新レス表示
レスジャンプ
類似スレ一覧
スレッドの検索
話題のニュース
おまかせリスト
オプション
しおりを挟む
スレッドに書込
スレッドの一覧
暇つぶし2ch