简体   繁体   English

SQL按星期几分组

[英]SQL Group by Day of Week

Using SQL Server 2012. I have a view that has two fields - Machine Date and Total Mins. 使用SQL Server2012。我有一个具有两个字段的视图-机器日期和总分钟数。 The view is only showing data from the previous week - this works fine. 该视图仅显示前一周的数据-效果很好。 I then have another view based on this view using the below SQL: 然后,我使用下面的SQL基于此视图创建另一个视图:

SELECT        
    CASE WHEN DATENAME(dw, MachineMidLineDate) = 'Sunday' THEN [Total Mins] END AS Sun, 
    CASE WHEN DATENAME(dw, MachineMidLineDate) = 'Monday' THEN [Total Mins] END AS Mon, 
    CASE WHEN DATENAME(dw, MachineMidLineDate) = 'Tuesday' THEN [Total Mins] END AS Tues, 
    CASE WHEN DATENAME(dw, MachineMidLineDate) = 'Wednesday' THEN [Total Mins] END AS Wed, 
    CASE WHEN DATENAME(dw, MachineMidLineDate) = 'Thursday' THEN [Total Mins] END AS Thursday, 
    CASE WHEN DATENAME(dw, MachineMidLineDate) = 'Friday' THEN [Total Mins] END AS Friday, 
    CASE WHEN DATENAME(dw, MachineMidLineDate) = 'Saturday' THEN [Total Mins] END AS Sat
FROM
    dbo.vw_Machine_Minutes_Overview

However, the results are not on one line, they increase with each day of the week ie 但是,结果不是一行,它们随着一周的每一天而增加,即

Sun    Mon   Tues   Wed  Thurs  Fri   Sat
10     
       15
              25
                    20
                          21
                                12

But I need the results to show like this: 但是我需要结果显示如下:

Sun    Mon   Tues   Wed  Thurs  Fri   Sat
10     15     25    20    21    12

Where am I going wrong? 我要去哪里错了?

You want aggregation: 您要聚合:

SELECT SUM(CASE WHEN DATENAME(dw, MachineMidLineDate) = 'Sunday' THEN [Total Mins] END) AS Sun,
       SUM(CASE WHEN DATENAME(dw, MachineMidLineDate) = 'Monday' THEN [Total Mins] END) AS Mon,
      . . . 
FROM dbo.vw_Machine_Minutes_Overview;

The comment about using pviot is another way to do it: 关于使用pviot的评论是另一种实现方式:

Working example: http://data.stackexchange.com/stackoverflow/revision/749735/930554/pivot-data-by-day-of-week-from-date-field 工作示例: http : //data.stackexchange.com/stackoverflow/revision/749735/930554/pivot-data-by-day-of-week-from-date-field

I find the syntax a bit confusing but this should work: 我发现语法有点混乱,但这应该可以工作:

select *
from 
(
select  datepart(dw,[MachineMidLineDate]) as DayOfWeek, [Total Mins]
  from #vw_Machine_Minutes_Overview 
) src
pivot
(
  sum([Total Mins])
  for DayOfWeek in ([1], [2], [3],[4],[5],[6],[7])
) piv;

The datepart(dw,[MachineMidLineDate]) part returns a number between 1 and 7 representing the day of the week, that is used to specify the columns in the [1],[2],[3]... part of the query. datepart(dw,[MachineMidLineDate])部分返回表示星期几的1到7之间的数字,该数字用于指定[1],[2],[3]...部分中的列。查询。

datepart: https://docs.microsoft.com/en-us/sql/t-sql/functions/datepart-transact-sql datepart: https : //docs.microsoft.com/zh-cn/sql/t-sql/functions/datepart-transact-sql

pivot: https://technet.microsoft.com/en-us/library/ms177410(v=sql.105).aspx 枢纽: https//technet.microsoft.com/zh-CN/library/ms177410(v = sql.105).aspx

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM