Изменение запроса перекрестного соединения
У меня есть запрос, который я обнаружил и хочу изменить, чтобы получить дополнительный столбец, а также суммировать последние 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 ответа
Я не был уверен, что тип данных 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;
- Вы можете суммировать столбцы на основе фильтров, используя регистр SUM(CASE WHEN U_PD_code = 'SYS033' THEN dbo.[@EIM_PROCESS_DATA].U_Amount В противном случае 0) в качестве оплаты, SUM(CASE WHEN U_PD_code = 'SYS034' THEN dbo.[@EIM_PROCESS_DATA].U_Amount Иначе 0) как PAYE2, - Очевидно твой ГДЕ становится ГДЕ (dbo. [@ EIM_PROCESS_DATA].U_PD_code IN ('SYS033', 'SYS034')) - Ваш месячный год фитлер может быть добавлен к вашему, где, как это.. - Вы можете конвертировать месяц в дату, а затем использовать МЕЖДУ параметром месяца и 2 месяца назад (всего 3 месяца) - Обратите внимание, что я принял название месяца для вашего параметра, при необходимости измените его на номер. Вы не дали никакой информации о году, поэтому я предположил, что это так, как показано. И МЕСЯЦ (U_Process_month + ' 1 2010') МЕЖДУ МЕСЯЦЕМ (@YourMonth + ' 1 2010') И МЕСЯЦ (@YourMonth + ' 1 2010') - 2 И dbo.[@EIM_PROCESS_DATA].U_Tax_year = @YourYear