2011-12-19 16 views
0

恐ろしいタイトルのために謝罪しますが、私はこれを簡単に説明する方法は考えていません。私は、53行を返す次のクエリを持っています。列の連結結果?

select distinct  
      p.building_name as 'Building', 
      p.building_id as 'ID', 
      p.state as 'State', 
      d.division_code + ' - ' + d.division_name as 'Division', 
      isnull(r.entity_id, 'None') as 'Entity Code' 
     -- isnull(cc.cost_centre, 'None') as 'Cost Centre' 
from  property.property p 
     left outer join property.division d on p.division_code = d.division_code 
     left outer join report_temp.entity_building r on p.building_id = r.building_id 
     --left outer join property.cost_centre cc on cc.entity_id = r.entity_id 
order by p.building_name asc 

私は、コードがなり、上記参加するコメントを解除すると、次のとエンティティコードごとに複数のコストセンターのありますように私は695行を受け取る:

select distinct  
      p.building_name as 'Building', 
      p.building_id as 'ID', 
      p.state as 'State', 
      d.division_code + ' - ' + d.division_name as 'Division', 
      isnull(r.entity_id, 'None') as 'Entity Code', 
      isnull(cc.cost_centre, 'None') as 'Cost Centre' 
from  property.property p 
     left outer join property.division d on p.division_code = d.division_code 
     left outer join report_temp.entity_building r on p.building_id = r.building_id 
     left outer join property.cost_centre cc on cc.entity_id = r.entity_id 
order by p.building_name asc 

は、私がしたいのは、CostCentre列の結果を連結結果として表示することで、53行の結果しか受け取らないということです。もう少し説明すると、他の列はすべて同じですが、エンティティコードごとに4つの異なるコストセンターがある場合、コストセンターの列は1つの列に「1111,1112,1113」と表示されます。

私は意味がありますか?これは可能ですか? (よりよく説明する)

編集:代わりに

Building ID Cost Centre 
20001  1111 
20001  1112 
20001  1113 

すなわち

Building ID Cost Centres 
20001  1111, 1112, 1113 

編集(答えて):解いてしまった

これは以下の通りです。また、再帰CTEの試みをするつもりとするとき、完全な利益のためにすることを掲載します:間違いなくあなたを助ける

with cte_building_data as 
(
    select distinct  
       p.building_name, 
       p.building_id, 
       p.state as 'State', 
       d.division_code + ' - ' + d.division_name as 'Division', 
       isnull(r.entity_id, 'None') as entity_id, 
       isnull(cc.cost_centre, 'None') as cost_centre 
    from  property.property p 
      inner join property.division d on p.division_code = d.division_code 
      inner join report_temp.entity_building r on p.building_id = r.building_id 
      inner join property.cost_centre cc on cc.entity_id = r.entity_id 
) 

SELECT 
    d.*   
    , 
    (select stuff 
    ( 
     ( SELECT ', ' + a.cost_centre 
      FROM 
      ( SELECT a.cost_centre, a.[entity_id] FROM cte_building_data a 
       WHERE a.[entity_id] = d.[entity_id] 

      ) a 

      FOR XML PATH('')) 
     , 1, 2, '' 
    ) AS cc_list) 

FROM (
     SELECT 

       d.entity_id, 
       d.[State], 
       d.[Division] 
     FROM cte_building_data d 
     GROUP BY     
       d.entity_id, 
       d.[State], 
       d.[Division] 
    ) d 
+0

あなたはcc.division_code = d.divison_codeのような条件を追加する必要があります。 – Arasu

+0

テーブルの制約内ではできません。私は恐れます(更新できる位置にはありません) – Codingo

答えて

2

あなたは事前に戻ってきますコストセンターのセットを知っていると仮定すると、私は何を探していることはSQL 2008 PIVOTコマンドであることを考える:ここhttp://msdn.microsoft.com/en-us/library/ms177410.aspx

欠点は、あなたがする必要があるということですピボットコマンド自体と、各コストセンターを独自の列として取得するため、コストセンターのセットを事前に把握しておく必要があります(連結する必要がある個々の列を有するケースはより柔軟性があり、従って好ましいものである)。

1

これは、純粋なSQLでは実行できません。 SQLを呼び出すプログラミング言語でロジックを記述する必要があります。 I. SQLステージの後に処理します。あなたが運が良ければ、データベースサーバにロジックをプッシュできるストアドプロシージャがあるかもしれませんが、私はそれについての専門家ではありません。

+0

それは残念です。とにかくありがとう! – Codingo

+2

厳密には真ではありません。これは、一連のCASEステートメントと結合を使用して実行できます。事前にコスト・センター全体を把握していることを前提としています。この特定のケースでは、SQL Server 2008にはpivotコマンドを使用したショートカットが用意されています(ただし、すべての列を前もって知るという制約があります)。 –

+1

修正していただきありがとうございます。値の数が一定であれば、多くの結合でそれを行うことができます。 – necromancer