Как получить сумму количества всех баз данных вместе через курсор
Я застрял в одном месте в запросе SQL. У меня есть 20 баз данных, и все имена таблиц и столбцов базы данных одинаковы, но данные разные. Я создаю SQL-запрос, чтобы получить сумму оплаты конкретной даты из всех баз данных вместе.
У меня есть много столбцов в таблице платежей. Мне нужно на сумму (сумму) в отношении там столбца paymentTypeID, потому что я могу получить сумму на основе paymentTypeID. Все идентификаторы paymentType различны в базах данных, но иногда они одинаковы. Я создал курсор для этого.
Мой код:
create table #tmpDBs(DBName varchar(255), CurrentDayPaymentAmount float)
declare cDBs cursor for
select name from master.dbo.sysdatabases
declare @DB varchar(255)
open cDBs
fetch next from cDBs into @DB
while @@fetch_status = 0
begin
exec('
declare @DateCurrent datetime
set @DateCurrent = '{Current Date}'
insert into #tmpDBs
select DBName = ' + @DB + ',
CurrentDayPaymentAmount = (select sum(p.amount) from ' + @DB + '.dbo.Payment p where p.eDate between @DateCurrent and dateadd(day, 1, @DateCurrent) and (p.paymenttypeid in (14, 15, 16, 17, 21, 22, 24, 35, 37, 38, 50)))
')
fetch next from cDBs into @DB
end
close cDBs
deallocate cDBs
select * from #tmpDBs
drop table #tmpDBs
Я использовал In, чтобы передать все базы данных paymenttypeid вместе. Этот код предназначен для получения суммы платежа из 2 баз данных. paymenttypeid 14, 15, 16,17, 22, 24, 38 - для первой базы данных, а 21, 35, 37, 50 - для второй базы данных. Моя проблема заключается в том, что, когда я помещаю эти paymentTypeID в предложение In, он добавляет сумму, соответствующую идентификатору paymenttype другой базы данных. Например, если фактическая сумма первой базы данных составляет 4589$, но она добавляет дополнительную сумму, скажем, 5469$, с использованием второй базы данных paymenttypeid. Если я передаю только одну базу данных, тип оплаты показывает правильную сумму.
В чем проблема в моем запросе.
1 ответ
Я думаю, что вы сами объяснили проблему: вам нужны только типы 1, 2 и 3 из DB1 и только типы 4, 5 и 6 из DB2, но ваш запрос этого не делает, он запрашивает типы 1, 2, 3, 4 5 и 6 из DB1 и DB2.
Это означает, что вам нужно использовать разные предложения WHERE для каждой базы данных, в зависимости от того, какие типы вы хотите. Итак, как вы знаете, какие типы вы хотите от каждой базы данных и как вы можете выразить эту логику в вашей хранимой процедуре?
Как совершенно другое решение, создайте представление в каждой базе данных с правильным предложением WHERE, а затем просто запросите представление для своего отчета.