为可怕的头衔道歉,但我不知道如何轻易地描述这一点。我有以下查询返回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 :(得分:2)
此链接绝对可以帮到您。 http://www.simple-talk.com/sql/t-sql-programming/concatenating-row-values-in-transact-sql/
感谢。
答案 1 :(得分:2)
假设您知道将提前获得的成本中心集,我认为您正在寻找的是SQL 2008 PIVOT命令:http://msdn.microsoft.com/en-us/library/ms177410.aspx
这里的缺点是你需要提前知道成本中心的集合,无论是对于枢轴命令本身还是因为你将每个成本中心都作为它自己的列,你需要连接它们(假设您确实需要一个大的连接列 - 在大多数情况下,具有单独的列将更灵活,因此更受欢迎。)
答案 2 :(得分:1)
这不能在纯SQL中完成。您需要使用调用SQL的某种编程语言编写逻辑。 I. e。在SQL阶段之后处理它。如果幸运的话,可能会有一些存储过程,以便您可以将逻辑推送到数据库服务器,但我不是专家。