2016-03-18 20 views
5

私は月ごとのアカウントごとに試算バランスの動きを見つけるのにこのSQLクエリを使用します。SQL - 累積月間カラム値を返す

/* Fixed Assets 1 */ 
SELECT * FROM 
(
    SELECT T0.AcctCode AS 'SAP Code', T0.AcctName AS 'Description', 
    MONTH(T1.RefDate) AS Month, SUM(T1.Debit - T1.Credit) AS 'Amount' 
    FROM OACT T0 
    LEFT JOIN JDT1 T1 ON T0.[AcctCode] = T1.[Account] 
    WHERE T0.AcctCode LIKE '111%' AND T0.Levels = 5 
    AND (T1.RefDate BETWEEN DATEADD(yy, DATEDIFF(yy,0,{?AsAtDate}), 0) AND {?AsAtDate}) 
    GROUP BY T0.AcctCode, T0.AcctName, T0.FatherNum, T1.RefDate) AS q 
    PIVOT 
(
SUM(Amount) 
FOR [Month] IN ([1],[2],[3],[4],[5],[6],[7],[8],[9],[10],[11],[12]) 
) AS query 

この6月から以下の結果を返し:

enter image description here

を私はすべての行の累積毎月の結果を含めたいように行 1の結果は、次のようになります。

1, 111110, Building Gross Value, 633604.23, 637764.23, 645313.03, 649061.78, 651097.78, 651097.78, 651397.78 

私はこれを達成するのに成功していません。これを達成するためにクエリを変更するにはどうすればよいですか?

追加データ:

クエリ:

SELECT CAST(T0.TaxDate AS Date), T0.Account, T1.AcctName, T0.Debit, T0.Credit 
FROM JDT1 T0 INNER JOIN OACT T1 
ON T0.Account = T1.AcctCode 
WHERE T0.[Account] = '111110' 

戻り値:

enter image description here

+0

いくつかのテストデータを提供します – TheGameiswar

+0

私はいくつかの詳細情報を追加しました –

答えて

3

あなたが別のものにあなたの列を追加するを選択:

SELECT AcctCode AS 'SAP Code', AcctName AS 'Description', 
col1 AS '1', 
col1 + col2 AS '2', 
col1 + col2 + col3 AS '3', 
... FROM (
    SELECT AcctCode, AcctName, 
    [1] AS col1, 
    [2] AS col2, 
    [3] AS col3, 
    ... FROM 
    (
     SELECT T0.AcctCode, T0.AcctName, 
     MONTH(T1.RefDate) AS Month, SUM(T1.Debit - T1.Credit) AS 'Amount' 
     FROM OACT T0 
     LEFT JOIN JDT1 T1 ON T0.[AcctCode] = T1.[Account] 
     WHERE T0.AcctCode LIKE '111%' AND T0.Levels = 5 
     AND (T1.RefDate BETWEEN DATEADD(yy, DATEDIFF(yy,0,{?AsAtDate}), 0) AND {?AsAtDate}) 
     GROUP BY T0.AcctCode, T0.AcctName, T0.FatherNum, T1.RefDate) AS q 
     PIVOT 
    (
    SUM(Amount) 
    FOR [Month] IN ([1],[2],[3],[4],[5],[6],[7],[8],[9],[10],[11],[12]) 
    ) AS query 
) 
+0

うーん、あなたのやり方を試しても結果は返っていません。 –

+0

私の答えを編集しました - ピボットがうまくいかないときにselectに列を追加しますが、これらの列を選択して別のselect from selectを使用して列を別の列に追加できます – dey

0

最も直接的な方法は、一時テーブルにピボットの結果をダンプする場合や、データセットがかなり小さい場合、テーブル変数。次に、UNIONを使用してPIVOTから累積結果とサブカテゴリを取得します。テーブル変数を使用した例を次に示します。あなたが外必要

/* Fixed Assets 1 */ 
SELECT * 
INTO #FixedAssets FROM 
(
    SELECT T0.AcctCode AS 'SAP Code', T0.AcctName AS 'Description', 
    MONTH(T1.RefDate) AS Month, SUM(T1.Debit - T1.Credit) AS 'Amount' 
    FROM OACT T0 
    LEFT JOIN JDT1 T1 ON T0.[AcctCode] = T1.[Account] 
    WHERE T0.AcctCode LIKE '111%' AND T0.Levels = 5 
    AND (T1.RefDate BETWEEN DATEADD(yy, DATEDIFF(yy,0,{?AsAtDate}), 0) AND {?AsAtDate}) 
    GROUP BY T0.AcctCode, T0.AcctName, T0.FatherNum, T1.RefDate) AS q 
    PIVOT 
(
SUM(Amount) 
FOR [Month] IN ([1],[2],[3],[4],[5],[6],[7],[8],[9],[10],[11],[12]) 
) AS query 
GO 

SELECT 
     [SAP Code] = '111110' 
    , [Description] = 'Building Gross Value' 
    , [1]   = SUM([1]) 
    , [2]   = SUM([2]) 
    , [3]   = SUM([3]) 
    , [4]   = SUM([4]) 
    , [5]   = SUM([5]) 
    , [6]   = SUM([6]) 
    , [7]   = SUM([7]) 
    , [8]   = SUM([8]) 
    , [9]   = SUM([9]) 
    , [10]   = SUM([10]) 
    , [11]   = SUM([11]) 
    , [12]   = SUM([12]) 
UNION 
SELECT * FROM #FixedAssets 
ORDER BY 1 
0

私が正しくあなたの質問を理解している場合は、カンマで1行の累積毎月の結果は、借方が

値分離必要
create table a 
(dateval date, acc int,accname varchar(100), debit decimal(10,2)) 

insert into a 
values 
('20150630', 111110, 'Building Gross Value', 633604.230), 
('20150731', 111110, 'Building Gross Value', 2760.000000), 
('20150730', 111110, 'Building Gross Value', 1400.000000), 
('20150808', 111110, 'BUIIdlngGrossValue', 1890.00), 
('20150811', 111110, 'BUIIdlnanossValue', 180.00), 
('20150811', 111110, 'Building Gross Value', 375.000000), 
('20150819', 111110, 'Building Gross Value', 2622.200000), 
('20150821', 111110, 'Building Gross Value', 360.000000), 
('20150822', 111110, 'Building Gross Value', 21.600000), 
('20150824', 111110, 'Building Gross Value', 100.000000), 
('20150825', 111110, 'Building Gross Value', 770.000000), 
('20150829', 111110, 'Building Gross Value', 100.000000), 
('20150831', 111110, 'Building Gross Value', 340.000000), 
('20150831', 111110, 'Building Gross Value', 790.000000), 
('20150924', 111110, 'Building Gross Value' ,918.750000), 
('20150928', 111110, 'Building Gross Value', 2830.000000), 
('20151005', 111110, 'Building Gross Value', 1411.000000), 
('20151023', 111110, 'Building Gross Value', 625.000000) 

以下のクエリは、カンマ区切りの値で1行に結果を表示します。

with cte as 
(
select * from 
(
    select a.dateval,b.acc,b.accname,sum(b.debit) as debit,row_number() over (partition by year(a.dateval),month(a.dateval) order by a.dateval desc) as rn 
    from (select distinct dateval from a) as a 
    inner join a as b 
    on a.dateval >= b.dateval 
    group by a.dateval,b.acc,b.accname 
) as a 
where rn = 1 
) 
select acc,accname,stuff((select ',' + cast(debit as varchar(1000)) from cte as b where a.acc = b.acc for xml path ('')),1,1,'') 
from cte as a 
group by acc,accname