【问题标题】:Modifying a cross join query修改交叉连接查询
【发布时间】:2013-04-04 22:42:20
【问题描述】:

我发现我想要修改这个查询以获得额外的列,并将最近 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 的字母数字字段,其中包含从一月到十二月的字符。由于查询如上,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')

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

【问题讨论】:

  • 你能提供一些样本数据和他们的预期结果吗?

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


【解决方案1】:
-- 您可以通过使用案例来根据过滤器对列进行汇总 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

【讨论】:

    【解决方案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;
    

    【讨论】:

      猜你喜欢
      • 2012-12-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-03-12
      • 2019-03-03
      • 2013-02-04
      • 2011-08-15
      相关资源
      最近更新 更多