我试图构建一个存储过程,允许我根据另一个条件从另一个值中减去基于特定条件的值,但我的问题是所有行都驻留在同一个表中。它可能更容易向您展示我的意思。
想象一下,如果你有下表(为简单起见保持简单)
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
这是否有意义?
感谢。
吨。
答案 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;