0

テーブルがあり、Expend列の合計を実行して、合計が同じWeek_Nameの値のみを合計するようにするとします。

SN  Week_Name  Exp  Sum
--  ---------  ---  ---
1   Week 1     10   0
2   Week 1     20   0
3   Week 1     30   60
4   Week 2     40   0
5   Week 2     50   90
6   Week 3     10   0

Week_Nameを「並べ替え」る必要があると想定し、前のWeek_Name(前の行)と現在の行Week_name(現在の行)を比較します。
両方が同じである場合は、SUM列にゼロを入力します。

同じでない場合は、すべての支出を追加します。ここで、Week_Name = Week_Name(前の行)で、[合計]列に配置します。最終的な出力は、上の表のようになります。

T-SQLでこれを実現する方法についてのヘルプは大歓迎です。

4

2 に答える 2

0

SN = 6の行が10ではなく0である理由がわかりません。先週の合計が本当に必要ではありませんか?先週の合計が問題ない場合は、次のようなものが必要になる場合があります。

;WITH CTE AS (
  SELECT Week_Name,SUM([Expend.]) as SumExpend
  ,MAX(SN) AS MaxSN
  FROM T
  GROUP BY Week_Name
  )
SELECT T.*,CASE WHEN T.SN = CTE.MaxSN THEN SumExpend
           ELSE 0 END AS [Sum]
FROM T
JOIN CTE on CTE.Week_Name = T.Week_Name

SUMの現在の合計が必要なコメントの要求に基づいて、これを試すことができます。

;WITH CTE AS (
SELECT Week_Name, MAX(SN) AS MaxSN
FROM T
GROUP BY Week_Name
)
SELECT T.SN, T.Week_Name,T.Exp, 
CASE WHEN T.SN = CTE.MaxSN THEN
(SELECT SUM(EXP) FROM T T2 
 WHERE T2.SN <= T.SN) ELSE 0 END AS [SUM]
FROM T
JOIN CTE ON CTE.Week_Name = T.Week_Name
ORDER BY SN
于 2012-06-02T06:37:12.017 に答える
0

さて、私は最終的にこの問題を解決することができました。イエスを賛美します! 上記の正確な表が必要な場合は、以下の GilM の応答を使用できます。完璧です。テーブルに累積値を実行させたい場合、つまり行 3 には 60、行 5 には 150、行 6 には 160 などを指定します。次に、以下のコードを使用できます。

USE CAPdb 
IF OBJECT_ID ('dbo.[tablebp]') IS NOT NULL
DROP TABLE [tablebp] 

GO
CREATE TABLE [tablebp] (
    tablebpcCol1 int PRIMARY KEY
  ,tabledatekey datetime
  ,tableweekname varchar(50)
  ,expenditure1 numeric
  ,expenditure_Cummulative numeric
)   

INSERT INTO [tablebp](tablebpcCol1,tabledatekey,tableweekname,expenditure1,expenditure_Cummulative)
SELECT b.s_tablekey,d.PK_Date,d.Week_Name,
SUM(b.s_expenditure1) AS s_expenditure1,
SUM(b.s_expenditure1) + COALESCE((SELECT SUM(s_expenditure1)
    FROM source_table bs JOIN dbo.Time dd ON bs.[DATE Key] = dd.[PK_Date]
    WHERE dd.PK_Date < d.PK_Date),0)
FROM source_table b
INNER JOIN dbo.Time d ON b.[Date key] = d.PK_Date 
GROUP BY d.[PK_Date],d.Week_Name,b.s_tablekey,b.s_expenditure1
ORDER BY d.[PK_Date]

;WITH CTE AS ( 
   SELECT tableweekname
   ,Max(expenditure_Cummulative) AS Week_expenditure_Cummulative
   ,MAX(tablebpcCol1) AS MaxSN 
FROM [tablebp] 
GROUP BY tableweekname 
) 
SELECT [tablebp].*
,CASE WHEN [tablebp].tablebpcCol1 = CTE.MaxSN THEN Week_expenditure_Cummulative
       ELSE 0 END AS [RunWeeklySum]
FROM [tablebp]
JOIN CTE on CTE.tableweekname = [tablebp].tableweekname
于 2012-06-02T23:53:35.817 に答える