从同一个表中的行计算SQL存储过程中的总计

时间:2011-12-03 03:11:34

标签: sql stored-procedures

我试图构建一个存储过程,允许我根据另一个条件从另一个值中减去基于特定条件的值,但我的问题是所有行都驻留在同一个表中。它可能更容易向您展示我的意思。

想象一下,如果你有下表(为简单起见保持简单)

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

首先,我想对按用户1和按日期分组的日期总和进行总结

Total     Date
9        20111105
13       20111106
7        20111117

接下来,我想总结所有其他用户的总日期,不包括user1和按日期分组

Total     Date
8         20111105
11        20111106
4         20111117

最后我想以某种方式让我的存储过程获取上述数据并给我以下内容。我想减去从" User1"中获得的总数。从所有其他用户获得的总数中,但使用日期作为匹配参数。

,最终结果如下:

Total     Date
-1        20111105
-2        20111106
-3        20111117

这是否有意义?

感谢。

吨。

3 个答案:

答案 0 :(得分: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)当User1在其他用户没有的一天有条目时,以及2)当其他用户在User1没有的那天有数据时

此处的工作示例 - http://data.stackexchange.com/stackoverflow/q/120224/

答案 1 :(得分:1)

我认为这会奏效......

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

答案 2 :(得分: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)

第二步: 创建一个temp2表并用其他用户信息填充它。

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

按日期排序asc)

步骤#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;