【问题标题】:SQL Query with AVG/Datediff/CASE带有 AVG/Datediff/CASE 的 SQL 查询
【发布时间】:2018-04-15 08:35:28
【问题描述】:
SELECT
    AVG(
        DATEDIFF(
            day,
            P.[ProjectCreatedDate],
            CASE WHEN T.[Reported Milestones] LIKE '02 Request Assigned' THEN T.[TaskActualFinishDate]
        )
    ) AS AverageAssignmentAge

我有上述查询,我​​试图找出创建日期和请求分配日期之间的平均分配天数。不行啊,怎么解决?

【问题讨论】:

  • 在case语句后使用end
  • 请发布您的其余查询和一些示例数据,并解释它是如何不工作的。您是否收到错误消息或只是不正确的结果?您使用的是什么 DBMS?
  • 提示:如果您有一个复杂的SELECT 子句,则可能值得使用子查询在逻辑上分隔中间结果以使其更具可读性。很遗憾,SQL 仍然不允许SELECT 中的迭代步骤和临时变量。
  • @Ankit Bajpai - 我在 CASE 语句之后使用了 END,但查询也没有产生任何结果。
  • @Dai 我收到语法错误,没有结果。我正在使用 Microsoft SQL Server 管理 Studio。

标签: sql sql-server case average datediff


【解决方案1】:

您需要将 datediff 函数移到 case 表达式中,然后将整个 case 表达式包含在聚合函数中。

SELECT
      AVG( CASE WHEN T.[Reported Milestones] LIKE '02 Request Assigned' THEN 
                  DATEDIFF(DAY,P.[ProjectCreatedDate],T.[TaskActualFinishDate])
           END)
      AS averageassignmentage

注意在处理任务“持续时间”时,“结束日期”通常是指“那天的结束”,但数据库中记录的内容等同于“那天的开始” ”。因此,您几乎肯定希望在 datediff 计算中添加一个,该计算计算从开始日期开始到结束日期开始的天数。

SQL Fiddle的测试/示例

CREATE TABLE Table1
    ([Reported Milestones] varchar(19), [ProjectCreatedDate] datetime, [TaskActualFinishDate] datetime)
;

INSERT INTO Table1
    ([Reported Milestones], [ProjectCreatedDate], [TaskActualFinishDate])
VALUES
    ('02 Request Assigned', '2017-10-01 00:00:00', '2017-10-10 00:00:00'),
    ('02 Request Assigned', '2017-10-01 00:00:00', '2017-10-10 00:00:00'),
    ('02 Request Assigned', '2017-10-01 00:00:00', '2017-10-10 00:00:00'),
    ('xxx', '2017-10-01 00:00:00', NULL),
    ('xxx', '2017-10-01 00:00:00', NULL)
;

查询 1

SELECT
      AVG( CASE WHEN [Reported Milestones] LIKE '02 Request Assigned' THEN 
                  DATEDIFF(DAY,[ProjectCreatedDate],[TaskActualFinishDate])+1
           END)
      AS averageassignmentage
    , COUNT( CASE WHEN [Reported Milestones] LIKE '02 Request Assigned' THEN 
                  TaskActualFinishDate
           END)
      AS sample_size
from table1

Results

| averageassignmentage | sample_size |
|----------------------|-------------|
|                   10 |           3 |

【讨论】:

  • 您的问题现在解决了吗?你对这个答案还有疑问吗?要接受答案“Click the Tick”了解更多信息,请参阅help/accepting
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-02-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多