2011-12-03 35 views
2

我想構建一個存儲過程,該存儲過程將允許我基於另一個條件從另一個值中減去基於特定條件的值,但我的問題是所有行居住在同一張桌子。向你展示我的意思可能會更容易一些。從同一表中的行計算SQL存儲過程中的總數

試想一下,如果你有如下表(保存爲簡單起見簡單)

ID Name  Total Date 
1  User1 5  20111106 
2  User2 6  20111106 
3  User3 7  20111105 
4  User1 8  20111106 
5  User3 4  20111117 
6  User1 4  20111117 
7  User5 1  20111105 
8  User1 9  20111105 
9  User3 5  20111106 
10 User1 3  20111117 

首先,我想按日期總結日期總只是user1和組

Total  Date 
9  20111105 
13  20111106 
7  20111117 

下一頁我想按日期排除其他所有用戶的總數,排除user1和按日期排列

Total  Date 
8   20111105 
11  20111106 
4   20111117 

最後我不知何故希望我的存儲過程採取上述數據並給我以下。我想從從所有其他用戶獲得的總數中減去從「用戶1」獲得的總數,但將該日期用作匹配參數。

而最終的結果將是如下:

Total  Date 
-1  20111105 
-2  20111106 
-3  20111117 

這是決策意識???

謝謝。

T.

回答

2

這似乎工作。

with User1Totals as 
(
    select [Name], sum(Total) as Total, [Date] 
    from YourTable 
    where [Name] = 'User1' 
    group by [Name], [Date] 
), 
OtherUsersTotals as 
(
    select sum(Total) as Total, [Date] 
    from YourTable 
    where [Name] <> 'User1' 
    group by [Date] 
) 

select isnull(t2.Total, 0) - isnull(t1.Total, 0), coalesce(t2.[Date], t1.[Date]) 
from User1Totals t1 
full outer join OtherUsersTotals t2 on t1.[Date] = t2.[Date] 
​

這種處理您的樣本數據的場景,以及其他兩個方案 - 1)當用戶1對,每天其他用戶沒有一個條目,和2)當其他用戶對每日數據該用戶1沒有。這裏

工作的例子 - http://data.stackexchange.com/stackoverflow/q/120224/

+0

謝謝!這正是我需要的。從來沒有見過data.stackexchange ....非常好......再次感謝。 – Thierry

+0

沒問題,很高興我能幫到你! –

1

我認爲這會工作...

DECLARE @Name VARCHAR(20) 
SET @Name='User1' 
SELECT 
    SUM(
     CASE 
      WHEN [email protected] THEN Total*-1 
      ELSE Total 
     END 
    ) [Total Adj] 
    ,Date 
FROM Table 
GROUP BY Date 
+0

我給一個嘗試...如果它的工作原理,它肯定是比我要發佈一個清晰的解決方案。我結束了創建2臨時表,然後做一個簡單的加入,並且工作.. – Thierry

+0

工作的魅力,但一個小問題...我認爲它是排除值爲null ...例如在一個特定的一天,User1可能不在特定的一天有任何記錄,但用戶2可能有..這應該理想地顯示用戶2的總數。使用臨時表方案處理它。 – Thierry

+0

+1如果user2有總數,這也會顯示日期總數。 –

0

可以實現這個結果通過創建臨時表。

步驟#01: 創建一個temp1表,併爲您的第一個用戶1帶來您的第一個需要的結果。

CREATE TABLE Temp1 
(
ID IDENTITY (1, 1) NOT NULL, 
Total int, 
Date datetime) 

insert into Temp1(Total , Date) 
values (select sum(Total) as Total , Date where Name = 'user1' group by Date order by Date asc) 

步驟#02: 創建TEMP2表,並與其他用戶inforamtion填充它。按日期遞增

CREATE TABLE Temp2 
(
ID IDENTITY (1, 1) NOT NULL, 
Total int, 
Date datetime) 

insert into Temp1(Total , Date) 
values (select sum(Total) as Total , Date where Name is not 'user1' group by Date 

順序)

步驟#03: 現在扣除記錄和刪除臨時表。

select (t2.Total - t1.Total) as Total , Date from temp2 t2 
inner join temp1 t1 on t1.ID = t2.ID; 

drop table temp1; 
drop table temp2; 
+0

嘿Syeda,這正是我發佈這個問題後發生的一切,但謝謝。 – Thierry