2011-12-03 38 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