Объединенные результаты для столбца? - PullRequest
0 голосов
/ 19 декабря 2011

Извиняюсь за ужасное название, но я не знаю, как это легко описать. У меня есть следующий запрос, который возвращает 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 ]

2 голосов
/ 19 декабря 2011

Предполагая, что вы знаете набор центров затрат, которые вы получите заранее, я думаю, что вам нужна команда SQL 2008 PIVOT: http://msdn.microsoft.com/en-us/library/ms177410.aspx

Недостатками здесь является то, что вам нужно заранее знать набор центров затрат, как для самой команды pivot, так и потому, что вы получите каждый центр затрат в виде отдельного столбца, который вам нужно будет объединить ( при условии, что вам действительно нужен один большой объединенный столбец - в большинстве случаев использование отдельных столбцов будет более гибким и поэтому предпочтительным).

2 голосов
/ 19 декабря 2011

Эта ссылка определенно вам поможет. http://www.simple -talk.com / SQL / T-SQL-программирование / конкатенация-строка-значения-в-Transact-SQL /

  1. Использование SQL CLR для конкатенации функции
  2. Использовать CTE
1 голос
/ 19 декабря 2011

Это не может быть сделано в чистом SQL.Вам нужно будет написать логику на каком-то языке программирования, который вызывает SQL.И. е.обработайте его после этапа SQL.Если вам повезет, возможно, есть какая-то хранимая процедура, чтобы вы могли перенести логику на сервер базы данных, но я не эксперт в этом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...