Как получить сумму количества всех баз данных вместе через курсор - PullRequest
1 голос
/ 07 октября 2011

Я застрял в одном месте в запросе 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 голос
/ 07 октября 2011

Я думаю, вы сами объяснили проблему: вам нужны только типы 1, 2 и 3 из DB1 и только типы 4, 5 и 6 из DB2, но ваш запрос этого не делает, он запрашивает типы 1, 2, 3, 4, 5 и 6 из DB1 и DB2.

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

Как совершенно другое решение, создайте представление в каждой базе данных с правильным предложением WHERE, а затем просто запросите представление для вашего отчета.

...