列の連結結果

恐ろしいタイトルのためにお詫び申し上げりますが、私はこれを簡単に説明する方法は考えていません。 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 Centres
20001       1111, 1112, 1113

の代わりに

Building ID Cost Centre
20001       1111
20001       1112
20001       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
私が恐れている表の制約の中で(そして私がそれらを更新できる位置に)
追加された 著者 Codingo,
cc.division_code = d.divison_codeなどの条件を追加する必要があります
追加された 著者 Arasu,

3 答え

Assuming that you know the set of cost centres that you will get back ahead of time, I think that what you are looking for is the SQL 2008 PIVOT command: http://msdn.microsoft.com/en-us/library/ms177410.aspx

ここでの欠点は、ピボットコマンド自体と、各コストセンターを独自の列として取得するために、事前にコストセンターのセットを知る必要があることです。連結する必要があります1つの大きな連結カラムが必要です。ほとんどの場合、個々のカラムを持つほうが柔軟性が高く、したがって好ましいでしょう)。

2
追加された

This link definitely help you. http://www.simple-talk.com/sql/t-sql-programming/concatenating-row-values-in-transact-sql/

  1. SQL CLRを使用して関数を結合する
  2. CTEを使用する

ありがとう。

2
追加された
優れたもの。どうもありがとうございました。
追加された 著者 Codingo,

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

1
追加された
それは残念です。とにかくありがとう!
追加された 著者 Codingo,
修正していただきありがとうございます。値の数が一定であれば、多くの結合でそれを行うことができます。
追加された 著者 necromancer,
厳密にはそうではありません。これは、一連のCASEステートメントと結合を使用して実行できます。事前にコスト・センター全体を把握していることを前提としています。この特定のケースでは、SQL Server 2008にはpivotコマンドを使用したショートカットが用意されています(ただし、すべての列を前もって知るという制約があります)。
追加された 著者 Chris Shain,