7

我有这个查询,我发现我想修改它以获得一个额外的列,并总结最近 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').

我如何实现这一目标?任何帮助表示赞赏。

4

2 回答 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;
于 2013-04-16T16:58:07.023 回答
2
-- 您可以通过使用案例来根据过滤器对列进行汇总
SUM(当 U_PD_code = 'SYS033' THEN dbo.[@EIM_PROCESS_DATA].U_Amount 时的情况
            ELSE 0) 作为付款,
SUM(当 U_PD_code = 'SYS034' THEN dbo.[@EIM_PROCESS_DATA].U_Amount 时的情况
            ELSE 0) 作为 PAYE2,

-- 显然你的 WHERE 变成了
WHERE (dbo.[@EIM_PROCESS_DATA].U_PD_code IN ('SYS033','SYS034'))

- 您的月份年份过滤器可以像这样添加到您的位置..
-- 您可以将月份转换为日期,然后使用 BETWEEN 一个月参数和 2 个月前(总共 3 个月)
-- 请注意,我为您的参数设定了月份名称,如果需要,请更改为数字。你没有提供关于年份的信息,所以我认为它如图所示。
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
于 2013-04-16T16:32:33.820 回答