Создание хранимой процедуры SQL для агрегирования данных из нескольких таблиц для создания отчета на конец месяца - PullRequest
1 голос
/ 01 июня 2011

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

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

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

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

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

Будет значительно упрощенный набор данных;table site {id, location}

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 a 2 b 3 c

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 Ответ

1 голос
/ 01 июня 2011

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

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

Я должен был немного угадать условие JOIN. Ваш подзапрос в вашем вопросе не связан с таблицами Site и SalesEnquiry. Это действительно дало вам правильные цифры? Присоединяйтесь к ним в любой колонке. Я угадал customer_id и id.

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