我有这个查询,我发现我想修改以获得额外的列,并总结找到的金额的最后3个月。我想为此制作一份水晶报告。 查询如下。
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
的字母数字字段,其中包含1月到12月的字符。如上所述,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')
。
我如何实现这一目标?任何帮助表示赞赏。
答案 0 :(得分: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;
答案 1 :(得分: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