【问题标题】:How to display range of date and reference from another Subquery?如何显示来自另一个子查询的日期范围和引用?
【发布时间】:2017-04-07 05:22:04
【问题描述】:

我有一个活动表列表..现在我想获取每天创建的活动计数

例如。结果是:

Date          Count
01/10/2016    100
02/10/2016    20
03/10/2016    3000

从网上搜索了几个小时,这是工作代码:

DECLARE @start_date DATE = '2016-10-01';
DECLARE @end_date DATE= '2016-10-10';

WITH    AllDays
        AS ( SELECT   @start_date AS [Date]
               UNION ALL
              SELECT   DATEADD(DAY, 1, [Date])
            FROM     AllDays
               WHERE    [Date] < @end_date ),
       PartitionCount
       AS (select count(*)      AS [Count]
          from Activities act
          where CAST(act.CreatedDate AS DATE) = '2016-10-01')
SELECT distinct [AllDays].[Date], [PartitionCount].[Count]
FROM   AllDays, PartitionCount, Activities
ORDER BY [AllDays].[Date]
OPTION (MAXRECURSION 0)

这将给出以下结果:

Date          Count
01/10/2016    100
02/10/2016    100
03/10/2016    100

然而,这个只得到当天2016-10-01的计数。

所以我尝试更改这部分代码,以便活动创建日期等于 AllDays 的日期列,并获取该特定日期的活动计数。

AS (select count(*)     AS [Count]
from Activities act
where CAST(act.CreatedDate AS DATE) = [AllDays].[Date])

但是,这会报错

“无法绑定多部分标识符”

非常感谢您对我如何进行此操作并获得所需结果的帮助:

Date          Count
01/10/2016    100
02/10/2016    20
03/10/2016    3000

示例表如下所示

Table: Activities

ID Title        CreatedDate         
1 Activity1 2016-10-03 10:00:00.000
2 Activity2 2016-10-03 11:30:00.000
3 Activity3 2016-10-03 14:00:00.000
4 Activity4 2016-10-03 14:30:00.000
5 Activity5 2016-10-04 10:00:00.000
6 Activity6 2016-10-05 11:00:00.000
7 Activity7 2016-10-06 10:00:00.000
8 Activity8 2016-10-07 11:00:00.000

【问题讨论】:

  • 您还需要提供要从中计算此结果的数据。
  • 用表格结构添加样本数据。
  • 嗨@CoderofCode,我只有一个看起来类似于此的简单表:表:活动标题 CreatedDate Activity1 2016-10-03 10:00:00.000 Activity2 2016-10-03 11:30: 00.000 Activity3 2016-10-03 14:00:00.000 Activity4 2016-10-03 14:30:00.000 Activity5 2016-10-04 10:00:00.000 Activity6 2016-10-05 11:00:00.000 Activity7 2016-10- 06 10:00:00.000 活动8 2016-10-07 11:00:00.000
  • 请为给定数据添加预期结果集。并查看我的答案,如果您需要的话,请告诉我。

标签: sql sql-server database sql-server-2008 join


【解决方案1】:

试试这个简单的例子, 创建过程并传递 2 个参数 StartDate、EndDate 和 Execute SP。

  declare @StartDate Date ='2016-10-01';
    declare @EndDate Date ='2016-10-10';

    select CreatedDate,COUNT(*) Count from Activities 
    where Convert(Date,CreatedDate) between @StartDate and @EndDate
    Group by CreatedDate 

【讨论】:

  • 这不会给出正确的输出,因为您需要将时间与日期分开,否则同一天行的不同时间将得到不同的计算。
  • 谢谢@TejashRaghav 让我也试试这个:)
  • 我试过了,但它没有返回每天的活动总数。它返回如下内容: 2016-10-03 16:19:00.000 1 2016-10-10 11:37:14.000 1 2016-10-10 06:57:29.000 1
  • 是的,你是对的,但我只用日期类型检查它。
【解决方案2】:

根据我的理解,您希望 Count 用于每一天的行。为此,您可以在给定范围内的每一天执行Group By,然后还可以执行COUNT 以获得您想要的内容,如下所示,

SELECT DATEADD(DAY,0, datediff(day,0, date)) As Date, COUNT(*) As Cont 
FROM #temp
WHERE date BETWEEN @startDate AND @endDate
GROUP By DATEADD(DAY,0, DATEDIFF(DAY,0, date))

【讨论】:

  • 非常快的思考者@CoderofCode,我会试试你的代码:) 谢谢
  • 我几乎花了一整天的时间才弄清楚该怎么做。而且,你一眨眼就做到了@CoderofCode 它有效!!!
  • @mmahinay 很高兴它有帮助。编码愉快。
猜你喜欢
  • 2019-04-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-31
  • 2017-10-22
  • 2015-07-27
  • 1970-01-01
相关资源
最近更新 更多