SQL-запрос присоединить строку в группе - PullRequest
2 голосов
/ 08 июня 2011

У меня есть эта структура таблицы

ProjectExpenses Table:
--------------------------------------
ProjectName    Expense     Currency
--------------------------------------
Foo            10          USD
Foo            20          USD
Foo            100         JPY
Bar            50          EUR
Bar            25          EUR

Я определенно хочу группировать по ProjectName; это все, что я знаю, но как я могу получить такой вывод

--------------------------
ProjectName    AllExpenses
--------------------------
Foo            30 USD, 100 JPY
Bar            75 EUR,

Я ищу функцию соединения строк, но я не знаю, с чего начать поиск, и даже если что-то подобное возможно только с помощью SQL-запроса.

Буду очень признателен за любые подсказки, как решить эту проблему.

Ответы [ 2 ]

2 голосов
/ 09 июня 2011

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

select ProjectName, Sum(Expense) as Expenses, Currency
from ProjectExpenses
group by ProjectName, Currency

Мы можем легко агрегировать список для одного проекта, например так:

declare @ProjectExpenses table
(
ProjectName varchar(500),
Expense int,
Currency varchar(500)
)

insert into @ProjectExpenses (ProjectName, Expense, Currency) values ('Foo', 10, 'USD')
insert into @ProjectExpenses (ProjectName, Expense, Currency) values ('Foo', 20, 'USD')
insert into @ProjectExpenses (ProjectName, Expense, Currency) values ('Foo', 100, 'JYP')
insert into @ProjectExpenses (ProjectName, Expense, Currency) values ('Bar', 50, 'EUR')
insert into @ProjectExpenses (ProjectName, Expense, Currency) values ('Bar', 25, 'EUR')


-- do the deed

declare @ProjectExpenseResults table
(
    ProjectName varchar(255),
    AllExpenses varchar(4000)
);

declare @ProjectName varchar(255);
declare @ExpenseList varchar(4000);

declare c cursor for
    select distinct ProjectName
    from @ProjectExpenses;
open c;
fetch next from c into @ProjectName;

while @@FETCH_STATUS = 0
begin
    set @ExpenseList = null;

    select @ExpenseList = ISNULL(@ExpenseList + ', ', '') + CAST(Expenses as varchar(255)) + ' ' + Currency
    from (
        select Sum(Expense) as Expenses, Currency
        from @ProjectExpenses
        where ProjectName = @ProjectName
        group by Currency
    ) t;

    insert into @ProjectExpenseResults ( ProjectName, AllExpenses )
        values (@ProjectName, @ExpenseList);

    fetch next from c into @ProjectName;
end

close c;
deallocate c;

select * from @ProjectExpenseResults
1 голос
/ 08 июня 2011

Поскольку вы используете SQL Server 2000, это будет довольно сложно (вам нужен эквивалент функции Oracle listagg ()), см. Сгруппированное объединение строк / LISTAGG для SQL Server

...