2011-12-19 92 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行結果。爲了更好地解釋 - 當所有其他列相同但每個實體代碼有四個不同的成本中心時,成本中心列在一列中顯示爲「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

你需要添加條件像cc.division_code = d.divison_code或類似的東西 – Arasu 2011-12-19 04:20:50

+0

不可能在表的約束內恐怕(而不是在我可以更新它們的位置) – Codingo 2011-12-19 04:23:35

回答

2

假設你掌握設定的成本中心,你會回來的時間提前的,我認爲你正在尋找的是SQL 2008轉動命令:http://msdn.microsoft.com/en-us/library/ms177410.aspx

的缺點這裏有你需要知道樞紐命令本身以及因爲您將每個成本中心作爲自己的列而提前知道成本中心集合,您需要將它們連接起來(假設您確實需要一個大型連接列 - 大多數具有單獨柱子的案例會更靈活,因此更受歡迎)。

1

這不能在純SQL中完成。您將需要用一些正在調用SQL的編程語言編寫邏輯。 I. e。在SQL階段之後處理它。如果幸運的話,可能會有一些存儲過程,以便將邏輯推送到數據庫服務器,但我不是這方面的專家。

+0

那真是太遺憾了。不管怎麼說,還是要謝謝你! – Codingo 2011-12-19 04:19:32

+2

不完全正確 - 假設您提前知道全套成本中心,則可以使用一系列CASE語句和連接完成此操作。在這種特殊情況下,SQL Server 2008使用pivot命令提供了一個快捷方式(但具有提前知道所有列的相同約束)。 – 2011-12-19 04:23:53

+1

正確,謝謝你的糾正。如果值的數量是恆定的,那麼可以通過許多聯接來完成。 – necromancer 2011-12-19 04:39:11