2013-04-12 4 views
7

У меня есть этот запрос, который я обнаружил, что хочу изменить, чтобы получить дополнительный столбец, а также суммировать последние 3 месяца найденных сумм. Я хочу сделать Crystal Report для этого. Запрос ниже.Изменение запроса перекрестного соединения

SELECT 
    dbo.[@EIM_PROCESS_DATA].U_Tax_year, 
    dbo.[@EIM_PROCESS_DATA].U_Employee_ID, 
    SUM(dbo.[@EIM_PROCESS_DATA].U_Amount) AS PAYE, 
    dbo.OADM.CompnyName, 
    dbo.OADM.CompnyAddr, 
    dbo.OADM.TaxIdNum, 
    dbo.OHEM.lastName + ', ' + ISNULL(dbo.OHEM.middleName, '') + ' ' + 
     ISNULL(dbo.OHEM.firstName, '') AS EmployeeName, dbo.OHEM.govID 

FROM dbo.[@EIM_PROCESS_DATA] 
     INNER JOIN dbo.OHEM ON dbo.[@EIM_PROCESS_DATA].U_Employee_ID 
              = dbo.OHEM.empID CROSS JOIN dbo.OADM 
WHERE (dbo.[@EIM_PROCESS_DATA].U_PD_code = 'SYS033') 

GROUP BY 
    dbo.[@EIM_PROCESS_DATA].U_Tax_year, 
    dbo.[@EIM_PROCESS_DATA].U_Employee_ID, 
    dbo.OADM.CompnyName, 
    dbo.OADM.CompnyAddr, 
    dbo.OADM.TaxIdNum, 
    dbo.OHEM.lastName, 
    dbo.OHEM.firstName, 
    dbo.OHEM.middleName, 
    dbo.OHEM.govID 

Таблица OHEM содержит буквенно-цифровое поле, называемое U_Process_month, который имеет символы с января по декабрь. Поскольку запрос такой, как указано выше, SUM(dbo.[@EIM_PROCESS_DATA].U_Amount) дает итоговые суммы для всех сумм PAYE, ie. U_PD_code = 'SYS033'.

Я хотел бы получить запрос, который добавит последние 3 месяца (PAYE) на основе выбранного года и месяца.

Я также хотел бы получить дополнительную колонку, SUM(dbo.[@EIM_PROCESS_DATA].U_Amount) as TAXABLEPAY where (dbo.[@EIM_PROCESS_DATA].U_PD_code = 'SYS034').

Как это достичь? Любая помощь оценивается.

+2

Можете ли вы предоставить некоторые примеры данных и ожидаемые результаты по ним? –

ответ

8

Я не был уверен, какой тип данных U_Tax_year был таким, чтобы я оставил его как INT. Однако этот запрос должен вернуть 3 месяца до месяца, который вы установили.

DECLARE @start_month DATETIME; 
DECLARE @start_year INT; 

SET @start_month = '2013-04-01'; 
SET @start_year = 2013; 

SELECT dbo.[@EIM_PROCESS_DATA].U_Tax_year 
    , dbo.[@EIM_PROCESS_DATA].U_Employee_ID 
    , SUM(CASE WHEN dbo.[@EIM_PROCESS_DATA].U_PD_code = 'SYS033' THEN dbo.[@EIM_PROCESS_DATA].U_Amount ELSE 0 END) AS PAYE 
    , SUM(CASE WHEN dbo.[@EIM_PROCESS_DATA].U_PD_code = 'SYS034' THEN dbo.[@EIM_PROCESS_DATA].U_Amount ELSE 0 END) AS TAXABLEPAY 
    , dbo.OADM.CompnyName 
    , dbo.OADM.CompnyAddr 
    , dbo.OADM.TaxIdNum 
    , dbo.OHEM.lastName + ', ' + ISNULL(dbo.OHEM.middleName, '') + ' ' + ISNULL(dbo.OHEM.firstName, '') AS EmployeeName 
    , dbo.OHEM.govID 
    FROM dbo.[@EIM_PROCESS_DATA]INNER JOIN dbo.OHEM ON dbo.[@EIM_PROCESS_DATA].U_Employee_ID = dbo.OHEM.empID CROSS JOIN dbo.OADM 
WHERE dbo.[@EIM_PROCESS_DATA].U_PD_code IN ('SYS033', 'SYS034') 
    AND dbo.OHEM.U_Process_month IN (DATENAME(MONTH, DATEADD(MONTH,-3, @start_month)), DATENAME(MONTH, DATEADD(MONTH,-2, @start_month)), DATENAME(MONTH, DATEADD(MONTH,-1, @start_month))) 
    AND dbo.[@EIM_PROCESS_DATA].U_Tax_year = @start_year 
GROUP BY dbo.[@EIM_PROCESS_DATA].U_Tax_year 
    , dbo.[@EIM_PROCESS_DATA].U_Employee_ID 
    , dbo.OADM.CompnyName 
    , dbo.OADM.CompnyAddr 
    , dbo.OADM.TaxIdNum 
    , dbo.OHEM.lastName 
    , dbo.OHEM.firstName 
    , dbo.OHEM.middleName 
    , dbo.OHEM.govID; 
2
 
-- You can sum up columns based on filters by using a case 
SUM(CASE WHEN U_PD_code = 'SYS033' THEN dbo.[@EIM_PROCESS_DATA].U_Amount 
      ELSE 0) AS PAYE, 
SUM(CASE WHEN U_PD_code = 'SYS034' THEN dbo.[@EIM_PROCESS_DATA].U_Amount 
      ELSE 0) AS PAYE2, 

-- Obviously your WHERE becomes 
WHERE (dbo.[@EIM_PROCESS_DATA].U_PD_code IN ('SYS033','SYS034')) 

-- Your month year fitler can be added to your where like this.. 
-- You can convert month to a date and then use BETWEEN a month parameeter, and 2 months back (3 months total) 
-- Note I assumed month name for your param, change to number if needed. You gave no info on year so I assumed it was as shown. 
AND MONTH(U_Process_month + ' 1 2010') BETWEEN MONTH(@YourMonth + ' 1 2010') AND MONTH(@YourMonth + ' 1 2010') - 2 
AND dbo.[@EIM_PROCESS_DATA].U_Tax_year = @YourYear