【问题标题】:Get a count and average from a couple rows in the same table?从同一张表中的几行中获取计数和平均值?
【发布时间】:2022-01-24 17:29:44
【问题描述】:

使用 Microsoft SQL Server,我试图获取某人在给定月份完成交易所需的平均天数。

每个用户都有数百笔交易,因此我正在寻找一种方法来计算每个人的交易数量以及每月的平均交易量。我还需要确保删除所有 NULL 返回并将所有负数转换为零,但要保留它。

对于 (Person | Transactions | Average),示例看起来像 (Max | 300 | 12.5)。

我已经做到了:

SELECT 
    [Transaction],
    [NAME],
    DATEDIFF (d, [Startdate], [Closedate]) AS Days
FROM 
    [Table]
WHERE 
    YEAR ([Startdate]) = 2021
    AND MONTH ([Closedate]) = 11
    AND Closedate IS NOT NULL

我试图弄清楚如何合并 CASE 语句,但是当我在 DATEDIFF 之前尝试这样做时它不起作用。

【问题讨论】:

  • count(), avg()
  • 请向minimal reproducible example 提供示例数据、所需结果(均为格式化文本而非图像)和您的尝试。
  • 在你的 datediff 函数中使用“d”而不是“day”你什么也没有保存——停止懒惰。但第一步是实际计算每个事务的完成值,因为您需要对其进行平均。我认为你做了一个有风险的假设。假设 StartDate 和 CloseDate 总是在同一个月是否合理?如果没有,请仔细查看您的 where 子句并考虑您实际选择了哪些行。考虑一下交易在 12 月开始并在 1 月结束时会发生什么。
  • 您可以将case 表达式用于各种事情,例如Sum( case when SomeColumn < 0 then 0 else SomeColumn end ) 对列的非负值求和,Sum( case when SomeColumn < 0 then 1 else 0 end ) 对负值进行计数。

标签: sql sql-server tsql


【解决方案1】:

看起来你可以用条件聚合做一个简单的GROUP BY

为避免重复 DATEDIFF 计算,您可以将其填充到 CROSS APPLY (VALUES 中。

始终使用日期间隔,例如 >= AND <,而不是在日期列上使用函数

SELECT 
    t.NAME,
    SUM(CASE WHEN v.Days > 0 THEN v.Days ELSE 0 END) AS TotalDays
FROM 
    [Table] t
CROSS APPLY (VALUES(
    DATEDIFF(day, t.Startdate, t.Closedate)
)) v(Days)
WHERE 
    t.Startdate >= '20211101'
    AND t.Startdate < '20211201'
    AND t.Closedate IS NOT NULL
GROUP BY
    t.NAME;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-07-19
    • 1970-01-01
    • 1970-01-01
    • 2014-08-17
    • 1970-01-01
    • 2016-06-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多