sqlの実装方法についての質問です。[環境]sql s

Writer: admin Type: 観葉植物 Date: 2018-12-13 00:00
sqlの実装方法についての質問です。[環境]sql server 2014sqlの実装方法でわからない事が2つできましたので、質問させていただきます。[概要]1つ目はテーブル内の一部のカラム(例えば:日付)などが被っているものの他のカラム(例えば:名前)同士をselectで連結させる方法についてです。[詳細]id 名前 日付 1 あああ 2018/11/112 いいい 2018/11/113 ううう 2018/11/12上記のようなレコードがあったとして日付が2018/11/11と被っている2つのレコードの名前をselect時に「あああいいい」のように連結させたいのですがどのようにすればよいのでしょうか?(idは必ずしも連番ではないです)[概要]2つ目も1つ目の内容と似ていますが、日付の差の計算について教えてください。id 名前 日付1 あああ 2016/01/012 いいい 2017/01/013 ううう 2018/01/01[詳細]上記のようなレコードがあったとしてidが「1」の日付とidが「2」の日付を引いた差id「2」の日付と「3」の日付を引いた差のようにレコード数に応じて、1レコード下のものと計算するような式を書くにはどのようにすればよいのでしょうか?(idは必ずしも連番ではないです)回答よろしくお願いいたします。共感した0###1点目は基本nob********さんと同様ですがwith q as ( select distinct 日付 from tbl )select 日付,replace((select 名前 + char(9) from tbl t2 where t2.日付=q.日付 for xml path('')),char(9),'') as 名前 from qスカラーサブクエリで同じ値を繰り返し抽出してまとめるより、まとめてからサブクエリを実行するほうが実行コストが小さいです。char(9)はタブコードです。「名前」に入る可能性が少ない文字コードを指定してまとめてからreplaceしたほうがリスクが小さくなります。char(10)の改行コードでも構いません。2点目はwith q as ( select *,lag( 日付 ) over(order by id ) as lag_日付from tbl )select * ,datediff( day, lag_日付, 日付 ) as 日数差 from qのほうが結合処理を行うよりも処理コストが少なくてすみます。先頭にあたる行については先行行が存在しないので「lag_日付」がNULLになりますが、それをどう扱うはお任せします。省きたいならwith q as ( select *,lag( 日付 ) over(order by id ) as lag_日付from tbl )select * ,datediff( day, lag_日付, 日付 ) as 日数差 from qwhere lag_日付 is not NULLでも。テーブル内の日付がNULLのものがすでに存在する場合はどういう結果を望むのかによります。ナイス0
###お二人ともご回答ありがとうございました。コードの内容がsql初心者の私からすると難しかったので解説を下さった方をベストアンサーとさせていただきました。本当にありがとうござしました。###select distinct 日付,replace((select 名前 as [data()] from tbl t2 where t2.日付=t1.日付 for xml path('')),' ','') as 名前 from tbl t1 とwith t(id,名前,日付,no) as (select *,row_number() over(order by id)as no from tbl2)select t1.id,t1.日付,t2.日付,datediff(day,t1.日付,t2.日付) as 日付差from t t1 inner join t t2 on t2.no=t1.no+1です。ナイス0

 

TAG