Как получить сумму всех баз данных вместе с помощью курсора

#sql-server #database-cursor

#sql-server #база данных-курсор

Вопрос:

Я застрял в одном месте в sql-запросе. У меня есть 20 баз данных, и имя таблицы и имя столбцов всех баз данных одинаковы, но данные разные. Я создаю sql-запрос, чтобы получить сумму платежа на определенную дату из всех баз данных вместе.

У меня много столбцов в таблице платежей. Мне нужно указать сумму (сумму) в отношении столбца paymentTypeID, потому что я могу получить сумму на основе paymentTypeID. Все идентификаторы paymenttypeid в базах данных разные, но иногда это одно и то же. Я создал курсор для этого.

Мой код:

  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, он добавляет сумму соответствующего paymenttypeid другой базы данных.
Например, если фактическая сумма первой базы данных составляет 4589 $, но она добавляет дополнительную сумму, скажем, 5469 $, используя второй paymenttypeid базы данных. Если я передаю только один paymenttypeid базы данных, он показывает правильную сумму.

В чем проблема в моем запросе.

Ответ №1:

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

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

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

Комментарии:

1. Спасибо за ответ. У меня есть все PaymentTypeID всех используемых баз данных. Я думаю, что это происходит из-за сопоставления одного paymenttypeid базы данных в другом paymenttypeid базы данных. Например, у меня есть 10 paymentid в одной базе данных и используется только 3 paymenttypeid. Если один из любых 3 или всех 3 paymenttypeid совпадает в другой базе данных, добавьте сумму этой базы данных и покажите неправильную сумму. И у меня есть программное обеспечение моей компании, в котором я не могу создавать представления или таблицы. В этом программном обеспечении я могу запускать только команду ВЫБОРА, создавать только временную таблицу и курсор. Это моя проблема. Как я могу это решить. Пожалуйста, помогите.