【问题标题】:Calculating totals in SQL stored procedure from rows from same table从同一表中的行计算 SQL 存储过程中的总计
【发布时间】:2011-12-03 03:11:33
【问题描述】:

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

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

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

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

最终结果如下:

Total     Date
-1        20111105
-2        20111106
-3        20111117

这有意义吗???

谢谢。

T.

【问题讨论】:

    标签: sql stored-procedures


    【解决方案1】:

    这似乎行得通。

    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 没有的数据时.

    这里的工作示例 - https://data.stackexchange.com/stackoverflow/q/120224/

    【讨论】:

    • 谢谢!这正是我所需要的。以前从未见过 data.stackexchange ......太好了......再次感谢。
    • 没问题,很高兴我能帮上忙!
    【解决方案2】:

    我认为这会奏效...

    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 个临时表,然后进行了一个简单的连接,并且成功了..
    • 工作了一个魅力,但一个小问题......我认为它不包括空值......例如在特定日期,用户1可能在特定日期没有任何记录,但用户2可能有.. 理想情况下,这应该只显示 user2 的总计。使用临时表场景可以解决这个问题。
    • +1 如果只有 user2 有总计,这也会显示日期总计。
    • 我没有关注我的 SQL 如何排除任何东西。我根本没有在 where 子句中指定用户。你能详细说明一下这个问题吗?
    【解决方案3】:

    您可以通过创建临时表来实现此结果。

    步骤#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 表并用其他用户信息填充它。

    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;
    

    【讨论】:

    • 嘿 Syeda,这正是我发布此问题后的处理方式,但谢谢。
    猜你喜欢
    • 2015-04-29
    • 1970-01-01
    • 1970-01-01
    • 2010-09-15
    • 1970-01-01
    • 2020-09-17
    • 1970-01-01
    • 2017-12-18
    • 1970-01-01
    相关资源
    最近更新 更多