SQL,有没有一种方法可以允许根据开始日期和结束日期字段在多个活动时间段内汇总数据?

时间:2019-02-18 12:08:17

标签: sql-server

我还是SQL和数据操作的新手,我也不知道是否有可能,因为我没有从相同的搜索中发现任何东西。我正在尝试根据开始日期和结束日期之间的有效期汇总数据。我所包含的当前代码有望使我对我想执行的聚合类型有所了解。

我试图寻找一种在SQL或Powerbi中实现此目的的方法,但是到目前为止,它还不够。我发现的大多数示例都是在单列而不是整个数据集上执行计算。我本来的想法是做一个计算列,列出活动的月数,但是我无法对其进行汇总,以压缩非常大的数据集。

SELECT [Group ID], [User], [Location], [category], [Setup Date], [End Date], Count([Name]) AS 'Number of Names'
Avg([Duration in Weeks]) AS 'Avg duration',Avg([Days since last production]) AS 'Avg days since last production',Avg([Losses]) AS 'Avg losses',
ROUND(AVG([Number produced]/NULLIF([duration in weeks],0)),2) AS Productivity
FROM [Summary].[dbo].[Summary$]
Group BY [Group ID], [User], [Location], [Category], [Setup Date], [End Date]

例如,如果设置日期为“ 2017-01-09”,结束日期为“ 2017-03-30”,我希望能够汇总此数据于2018年1月,2018年2月和2018年3月的数据都在同一个表中。希望我能提供足够的信息并清楚地说明,但是如果需要提供其他信息,请告诉我。

Small snippet of raw data

1 个答案:

答案 0 :(得分:0)

您可以使用CTE创建期间

DECLARE @yearfrom int = 2017, @yearto int = 2019
;WITH months AS (
        SELECT 1 AS MonthNum, DATENAME(Month,DATEFROMPARTS(1,1,1)) AS MonthName
        UNION ALL
        SELECT MonthNum + 1, DATENAME(Month,DATEFROMPARTS(1, MonthNum + 1, 1)) AS MonthName
        FROM months
        WHERE MonthNum <= 11
    ),
    years as (
        SELECT @yearfrom as year
        union all
        select year + 1 
        from years where year < @yearto
    ),
    dates as (
        SELECT Year, MonthNum, MonthName, DATEFROMPARTS(Year, MonthNum, 1) AS DateStart, DATEADD(MONTH, 1, DATEFROMPARTS(Year, MonthNum, 1)) AS DateEnd
        FROM years
        CROSS JOIN months
    )
SELECT d.year, d.MonthNum, d.MonthName, [Group ID], [User], [Location], [category], Count([Name]) AS 'Number of Names'
Avg([Duration in Weeks]) AS 'Avg duration',Avg([Days since last production]) AS 'Avg days since last production',Avg([Losses]) AS 'Avg losses',
ROUND(AVG([Number produced]/NULLIF([duration in weeks],0)),2) AS Productivity
FROM 
DATES d
LEFT JOIN [Summary].[dbo].[Summary$] ON 
    ([Setup Date] >= d.DateStart AND [Setup Date] < d.DateEnd)
    OR ([End Date] >= d.DateStart AND [End Date] < d.DateEnd)
Group BY d.year, d.monthnum, d.monthname, [Group ID], [User], [Location], [Category]