Fyl*_*lix 4 sql sql-server pivot
我承认这是迄今为止我必须面对的最复杂的SQL语句之一.我在这个问题上遇到了问题,我希望有人能帮助我.
我在数据库中有这个表
Item ActiveTime(sec) DateTime
-------------------------------------------
1 10 2013-06-03 17:34:22 -> Monday
2 5 2013-06-04 17:34:22 -> Tuesday
1 2 2013-06-03 12:34:22 -> Monday
1 3 2013-06-04 17:33:22 -> Tuesday
Run Code Online (Sandbox Code Playgroud)
我希望它在我的SQL语句之后看起来像这样
Item Mon Tues Wed Thurs Fri Sat Sun Average
-----------------------------------------------------------------------------------
1 6 3 5
2 5 5
Run Code Online (Sandbox Code Playgroud)
这个怎么运作
你可以看到星期一的平均值是6,因为(10 + 2)/ 2天星期二的平均值只有3,因为它只发生在星期二一次.项目1的平均值为5,因为(10 + 2 + 3)/ 3 = 5
它仅在星期二发生一次,因此第2项的星期二平均值为5.平均值为5,因为它只发生一次,因此5/1 = 5.
到目前为止,我想出了以下SQL语句,该语句旨在显示按工作日细分的每个项目的平均ActiveTime以及每个项目的总体平均ActiveTime:
Select *,((ISNULL([Sunday],0) +ISNULL([Monday],0)+ ISNULL([Tuesday],0)+
ISNULL([Wednesday],0)+ ISNULL([Thursday],0)+ISNULL([Friday],0)+
ISNULL([Saturday],0)) /
( CASE WHEN [Sunday] is null
THEN 0 ELSE 1 END +
CASE WHEN [Monday] is null
THEN 0 ELSE 1 END +
CASE WHEN [Tuesday] is null
THEN 0 ELSE 1 END +
CASE WHEN [Wednesday] is null
THEN 0 ELSE 1 END +
CASE WHEN [Thursday] is null
THEN 0 ELSE 1 END +
CASE WHEN [Friday] is null
THEN 0 ELSE 1 END +
CASE WHEN [Saturday] is null
THEN 0 ELSE 1 END )) as Avg
FROM ( SELECT * FROM
(
SELECT a.ResetTime as ResetTime,a.ApartmentDescription as Apartment,
DATENAME(WEEKDAY,a.DateTime) _WEEKDAY
FROM tblECEventLog a
)
AS v1 PIVOT (AVG(ResetTime) FOR _WEEKDAY IN
([Sunday],[Monday],[Tuesday],[Wednesday],[Thursday],[Friday], [Saturday])
)
AS v2
)
AS v3
Run Code Online (Sandbox Code Playgroud)
运行上面的SQL将产生以下结果:
Item Mon Tues Wed Thurs Fri Sat Sun Average
-----------------------------------------------------------------------------------
1 6 3 4.5
2 5 5
Run Code Online (Sandbox Code Playgroud)
所以它几乎可以工作,但注意值4.5,它通过做(6 + 3)/ 2这是不正确的,我不想只是添加平均值.Andybody可以建议改进我的SQL语句,使用每个项目的实际平均ActiveTime进行平均计算?
您应该可以使用它avg() over()来获得结果.这将允许您按以下方式对数据进行分区item:
avg(ActiveTime) over(partition by item) Avg_Item
Run Code Online (Sandbox Code Playgroud)
所以完整的查询将是:
SELECT item,
[Sunday],
[Monday],
[Tuesday],
[Wednesday],
[Thursday],
[Friday],
[Saturday],
Avg_Item
FROM
(
SELECT a.ActiveTime as ActiveTime,a.Item as Item,DATENAME(WEEKDAY,a.DateTime) _WEEKDAY,
avg(ActiveTime) over(partition by item) Avg_Item
FROM TableA a
) AS v1 PIVOT
(
AVG(ActiveTime)
FOR _WEEKDAY IN
(
[Sunday],[Monday],[Tuesday],[Wednesday],[Thursday],[Friday],[Saturday])
) AS v2;
Run Code Online (Sandbox Code Playgroud)
请参阅SQL Demo
| 归档时间: |
|
| 查看次数: |
5785 次 |
| 最近记录: |