修改交叉连接查询

时间:2013-04-12 11:55:54

标签: sql sql-server-2008 crystal-reports-8.5

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

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

2 个答案:

答案 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
相关问题