2011-06-01 2 views
1

В настоящее время я использую MS Sql2000, хотя мы обсуждаем его обновление до 2005 года (если это влияет на что-либо, я предполагаю, что это довольно стандартный SQL, Мне нужно)Создание хранимой процедуры SQL для агрегирования данных из нескольких таблиц для создания отчета о конце месяца

Один из наших продуктов Треки Продажа различных отделов по всей стране. В настоящее время я запускаю 3 Почти идентичные хранимые процедуры в Query Analyzer, а затем скопируйте результаты в excel и потратьте час, обрабатывая все это на одной электронной таблице.

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

Решение, которое я начал придумывать, включало временную таблицу, в которой я бы сначала потянул все сайты, а затем, в свою очередь, обновил ее с результатами каждого из запросов, которые я сейчас запускаю самостоятельно, но я попал в всевозможные неприятности, поэтому я решил лучше начать заново, и попросить руководство и помощь.

SQL является своего рода перефразировать так, пожалуйста, не забрать меня на простых синтаксических ошибок :-)

А много упрощенный набор данных будет; таблица сайта { идентификатор, расположение}

table salesEnquiry {siteId, custoemrId, 
DepositDate, BalancePaidDate, Status} 
--Status can be (0,1,2,3 for not started, deposit, completed,cancelled 

И от этого, я имею в виду вдоль линий;

--Set up the Whole Table 
declare @tmp TABLE (id, Site, Deposits, Completed, Cancelled) 

insert into @tmp (id, site) 
select id, site from site 

update @tmp 
set Deposits = (select count(customerId) from salesEnquiry 
    where DepositPaidDate >= @startOfMonth and DepositPaidDate <= @endOfMonth and status = 1) 

** This is the point I get lost I think, as Im not sure how to relate total number of deposits taken against the tmpId's as not all departments will take a deposit each month. 

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

SiteId Location TotalDeposits TotalCompleted TotalCancelled  
    1   a    3    0     1 
    2   b    0    0     0 
    3   c    1    17     0 

отредактировано для добавления выборочных данных + Результат. ** Извините, не могу фигурировать форматирование **

Хорошо, надеюсь, это поможет. сайт идентификатор местоположения 1 а 2 б 3 с

salesEnquiry 
id custId deposit  complete  status 
1 1  10/05/2011 null   1 
2 2  11/04/2011 11/05/2011 2 
1 3  12/05/2011 null   1 
1 4  13/05/2011 13/05/2011 2 
3 5  14/05/2011 null   3 
3 6  13/02/2011 13/05/2011 3 

даст

SiteId Location Deposits Completed Cancelled 
1  a  2   1  0 
2  b  0   1  0 
3  c  0   0  2 

ответ

1

Я не уверен, что «и так далее» указывает на то, но до до этого момента нижеследующие должны работать:

SELECT 
    S.id AS SiteId, 
    S.site AS Location, 
    SUM(CASE WHEN SE.status = 1 THEN 1 ELSE 0 END) AS TotalDeposits, 
    SUM(CASE WHEN SE.status = 2 THEN 1 ELSE 0 END) AS TotalCompleted, 
    SUM(CASE WHEN SE.status = 3 THEN 1 ELSE 0 END) AS TotalCanceled 
FROM 
    Sites S 
LEFT OUTER JOIN SalesEnquiry SE ON 
    SE.customer_id = S.id AND 
    (
     (
      SE.status IN (1, 3) AND 
      SE.DepositPaidDate >= @startOfMonth AND 
      SE.DepositPaidDate <= @endOfMonth 
     ) OR 
     (
      SE.status IN (2, 3) AND 
      SE.BalancePaidDate >= @startOfMonth AND 
      SE.BalancePaidDate <= @endOfMonth 
     ) 
    ) 
GROUP BY 
    S.id, 
    S.site 
ORDER BY 
    S.id 

Мне пришлось немного угадать состояние кондиционирования воздуха п. Вы являетесь подзапросом в своем вопросе, похоже, не связаны с таблицами Site и SalesEnquiry. Действительно ли это дает вам правильные цифры? Присоединяйтесь к ним в зависимости от того, какая колонка имеет значение. Я догадался customer_id и id.

+0

SOrry, и т. Д. Предназначалось для обозначения еще нескольких рядов результатов. – Matt

+0

Gotcha. Тогда я думаю, что вышесказанное даст вам то, что вам нужно. Сообщите мне, если вы не получите правильные результаты или вам нужно объяснить, как работает запрос. –

+0

Проблема с ответом, который у вас есть, (по моей вине я должен был объяснить больше), состоит в том, что заполненные случаи должны отслеживать завершенную дату, поэтому я могу видеть те, которые только взяли депозит в месяц, и те, которые приняли завершение оплата отдельно.Принимая во внимание, что аннулированный может быть депозитом или завершен в течение этого месяца. Подпробовал не дал правильную информацию, как если бы я пытался вернуть идентификатор, а также счетчик, я получаю сообщение об ошибке, поэтому я не могу видеть, как связать набор результатов с тем, что их id не выполняет цикл for – Matt

Смежные вопросы