我还是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月的数据都在同一个表中。希望我能提供足够的信息并清楚地说明,但是如果需要提供其他信息,请告诉我。
答案 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]