[英]Sum two rows (one previous row and one is current row in same table) in SQL
[英]SSMS SQL - Compare one row in a table to previous - Status change
我使用的表格包含每周機會及其各自狀態的記錄。 我想比較機會的最新狀態及其之前的一周(例如:狀態從“正在探查”變為“談判”)。 我想將與上周相比本周所有值已更改的那些插入到新表中。 注意:在該表的“周”中,0是當前周,1是前一周,2是前兩周,依此類推。
表歷史記錄示例:
+--------+---------+-------------+-----+
|Acc_Num | Opp_Num | Stage | Week|
+--------+---------+-------------+-----+
| 1 | 1 | Won | 0 |
+--------+---------+-------------+-----+
| 1 | 1 | Negotiation | 1 |
+--------+---------+-------------+-----+
| 1 | 1 | Prospecting | 2 |
+--------+---------+-------------+-----+
| 1 | 2 | Prospecting | 0 |
+--------+---------+-------------+-----+
| 1 | 2 | Prospecting | 1 |
+--------+---------+-------------+-----+
| 2 | 1 | Negotiation | 0 |
+--------+---------+-------------+-----+
| 2 | 1 | Prospecting | 1 |
+--------+---------+-------------+-----+
例如目標表:
+--------+---------+-------------+-----+
|Acc_Num | Opp_Num | Stage | Week|
+--------+---------+-------------+-----+
| 1 | 1 | Won | 0 |
+--------+---------+-------------+-----+
| 1 | 1 | Negotiation | 1 |
+--------+---------+-------------+-----+
| 2 | 1 | Negotiation | 0 |
+--------+---------+-------------+-----+
| 2 | 1 | Prospecting | 1 |
+--------+---------+-------------+-----+
我停留在比較上周各個階段的第一步。 這是我嘗試過但無法使用的SQL代碼:
SELECT *
INTO Goal_Table
FROM (
SELECT Acc_Num
,Opp_Num
,Stage
,Week
,CONCAT(Acc_Num, Opp_Num,Week) AS Unq_ID
FROM Table_History) as A
Left Join
(SELECT Acc_Num
,Opp_Num
,Stage
,Week
,CONCAT(Acc_Num, Opp_Num,Week) AS Unq_ID
FROM Table_History) as B
ON A.Unq_ID=B.Unq_ID AND A.Week=B.Week-1
我不斷收到有關列名需要唯一的錯誤。 這是實際的錯誤文本:“每個表中的列名必須是唯一的。表'Goal_Table'中的列名'Acc_Num'被多次指定。
感謝您的幫助或指導
使用分析功能可以更輕松地完成此操作,分析功能更易於閱讀,甚至更快。 當您引用ssms時,我將提供一個使用t-sql的示例:
create table dbo.Table_History
(
Acc_Num int,
Opp_Num int,
Stage nvarchar(50),
WeekNumber int
)
insert into dbo.Table_History
values
(1,1,'won',0),
(1,1,'Negotiation',1),
(1,1,'Prospecting',2),
(1,2,'Prospecting',0),
(1,2,'Prospecting',1),
(2,1,'Negotiation',0),
(2,1,'Prospecting',1)
WITH CompareWeeks AS
(
SELECT
Acc_Num AS Acc_Num,
Opp_Num AS Opp_Num,
Stage AS Stage_Cur,
WeekNumber as WeekNumber_cur,
lag(Stage) over (partition by Acc_Num, Opp_Num order by WeekNumber desc) AS Stage_prev,
lag(WeekNumber) over (partition by Acc_Num, Opp_Num order by WeekNumber desc) as WeekNumber_prev
FROM dbo.Table_History
)
SELECT
Acc_Num,
Opp_Num,
Stage_Cur,
WeekNumber_cur
--INTO dbo.GoalTable
FROM CompareWeeks
WHERE Stage_Cur <> Stage_prev and Stage_prev is not null
請注意,您上面提供的示例似乎不一致。 您沒有考慮(1,1)的第一行,但考慮了(2,1),即使沒有一周可以比較。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.