2011-01-08 15 views
4

私はCOALESCEとFOR XMLを使用して何をしようとしているかの例をいくつか見てきました。私は構文の権利をあまり得られません。ここでT-SQLクエリ、複数の行の列を1つの列に結合する

は、私は(私は唯一のキーのものにフィールドが短くなります)持っているものです。

Table     Fields 
------     ------------------------------- 
Requisition    ID, Number 
IssuedPO     ID, Number 
Job      ID, Number 
Job_Activity    ID, JobID (fkey) 
RequisitionItems   ID, RequisitionID(fkey), IssuedPOID(fkey), Job_ActivityID (fkey) 

私はそれに関連するジョブとIssuedPOsで1行に1つの求人をリストするクエリを必要としています。 (請求番号は「R-」で始まり、ジョブ番号は「J-」で始まります)。

例:

R-123 | "PO1; PO2; PO3" | "J-12345; J-6780"

確かにアダム!

複数の行を返すクエリは次のとおりです。私は外側の結合を使用する必要があります。なぜなら、すべての要求がジョブやIssuedPOに割り当てられているRequisitionItemを持っているわけではないからです(その場合、fkey IDはもちろんnullになります)。

SELECT DISTINCT Requisition.Number, IssuedPO.Number, Job.Number 
     FROM Requisition 
     INNER JOIN RequisitionItem on RequisitionItem.RequisitionID = Requisition.ID 
     LEFT OUTER JOIN Job_Activity on RequisitionItem.JobActivityID = Job_Activity.ID 
     LEFT OUTER JOIN Job on Job_Activity.JobID = Job.ID 
     LEFT OUTER JOIN IssuedPO on RequisitionItem.IssuedPOID = IssuedPO.ID 
+0

クエリは、このようなことを行うのに最適な場所ではありません。何が欲しいのはSQLのリレーショナルな性質に反しています。グループ化は、アプリケーションコードまたはTransact-SQLストアドプロシージャコードで行うことができます。 – 9000

+0

@ 9000私はそれが理想的にはSQLで行われたものではないことに同意しますが、ストアドプロシージャでこれを行う方がどのように「より良い」ものであるかはわかりません一時テーブルまたはメモリテーブル)。 –

+0

@ adam-robinson:TSQLには、複数の行を1つの文字列にまとめるのに役立つカーソルループと可変変数があります。詳細クエリ全体を実行し、文字列にパックし、マスタークエリで使用する関数を作成できます。 – 9000

答えて

4

ここでサブクエリを使用して、それを行うための一つの方法です:

select 'R-' + cast(r.number as varchar(32)) as RequisitionNumber 
,  (
     select 'PO' + CAST(ip.number as varchar(32)) + ';' 
     from IssuedPO ip 
     join RequisitionItems ri 
     on  ip.id = ri.IssuedPOID 
     where ri.RequisitionID = r.id 
     for xml path('') 
     ) as POList 
,  (
     select 'J-' + CAST(j.number as varchar(32)) + ';' 
     from Job j 
     join Job_Activity ja 
     on  j.id = ja.JobID 
     join RequisitionItems ri 
     on  ri.Job_ActivityID = ja.id 
     where ri.RequisitionID = r.id 
     for xml path('') 
     ) as JobList 
from Requisition r 
+0

私はそれを試してみる、ありがとう。あなたは分かりやすくするために、 "R-"と "PO-"を前に付ける必要はありませんでした。 :) – Shayne

+0

それは働いた。どうもありがとう!!! – Shayne

+0

キャストを使用している場合はレポートを使用することを忘れないでください。そうしないと、無効なデータ型が返されます – LeSteelBox

関連する問題