列的连接结果?

时间:2011-12-19 03:59:35

标签: sql sql-server sql-server-2008 tsql

为可怕的头衔道歉,但我不知道如何轻易地描述这一点。我有以下查询返回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

3 个答案:

答案 0 :(得分:2)

此链接绝对可以帮到您。 http://www.simple-talk.com/sql/t-sql-programming/concatenating-row-values-in-transact-sql/

  1. 使用SQL CLR连接功能
  2. 使用CTE
  3. 感谢。

答案 1 :(得分:2)

假设您知道将提前获得的成本中心集,我认为您正在寻找的是SQL 2008 PIVOT命令:http://msdn.microsoft.com/en-us/library/ms177410.aspx

这里的缺点是你需要提前知道成本中心的集合,无论是对于枢轴命令本身还是因为你将每个成本中心都作为它自己的列,你需要连接它们(假设您确实需要一个大的连接列 - 在大多数情况下,具有单独的列将更灵活,因此更受欢迎。)

答案 2 :(得分:1)

这不能在纯SQL中完成。您需要使用调用SQL的某种编程语言编写逻辑。 I. e。在SQL阶段之后处理它。如果幸运的话,可能会有一些存储过程,以便您可以将逻辑推送到数据库服务器,但我不是专家。