7

追加の列を取得し、見つかった金額の過去 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

このテーブルには、 1 月から 12 月までの文字を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')

どうすればこれを達成できますか? どんな助けでも感謝します。

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(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) PAYE2として、

-- 明らかにあなたの WHERE は
WHERE (dbo.[@EIM_PROCESS_DATA].U_PD_code IN ('SYS033','SYS034'))

-- あなたの月年フィトラーは、このようにあなたの場所に追加できます..
-- 月を日付に変換してから、BETWEEN a month パラメータと 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 に答える