2015-09-07 247 views
0

我有一個結果集,它由一個日期字段和值列組成。SQL Server:按日期字段分組,按時間和日期排序

日期列可以是從周,月,幾個月到幾年的範圍。格式爲YYYY-mm-dd hh:mm:ss.ssss(例如,2015-03-01 00:00:00.000)

值列是一個簡單的小數。

我很難按照我想要的方式獲得結果。

從下面的查詢中,您可能會看到我正在嘗試實現的目標。 我正在從結果集中選擇相對月份,小時數,日期和值。

SELECT 
    CONVERT(VARCHAR(2), datefield, 108) AS hourSlot, 
    SUM(value) AS hourTotal, 
    DATEPART(day,datefield) as day, 
    CASE CONVERT(VARCHAR(2), datefield, 108) 
     WHEN @stationStartTime 
      THEN 1 
      ELSE 0 
    END AS sortOrder 
FROM 
    @hourTotalTemp 
WHERE 
    DATEPART(MM, datefield) = 3 
GROUP BY 
    DATEPART(day,datefield) 
ORDER BY 
    day, sortOrder, CONVERT(VARCHAR(2), datefield, 108) 

正如你所見。我需要結果按小時分組。然後按電臺的開始時間排序,也按月份的日期排序。

編輯:

enter image description here

如上所述,用於查詢的最終結果。

將是它的月回報小時插槽,從定義的「起始時間」開始,相對天(S)(1,2,3,4,5,6,7th等),和那麼這些日子的價值。

結果爲@hourtotalTemp

datefield    value 
------------------------------  
2015-02-01 00:00:00.000 0 
2015-02-01 01:00:00.000 0 
2015-02-01 02:00:00.000 0 
2015-02-01 03:00:00.000 0 
2015-02-01 04:00:00.000 0 
2015-02-01 05:00:00.000 0 

編輯設置

enter image description here

這就是我想實現與查詢什麼。頂部的時間,左邊的一天。數據在中間。

+2

1日起有沒有顯示格式。](http://stackoverflow.com/questions/30032915/how-to-cast-the-datetime-to-time/30033028#30033028)2.請編輯您的問題,包括一些示例數據(最好是ddl + dml)和所需的輸出。 –

+0

@Zohar感謝您的輸入。我已根據要求進行了修改。 – dannyb2100

回答

0

爲什麼不在子查詢中進行分組,然後只對外部查詢進行排序?事情是這樣的......

SELECT * 
from (select CONVERT(VARCHAR(2), datefield, 108) AS hourSlot, 
     SUM(value) AS hourTotal, 
     DATEPART(day,datefield) as day, 
     CASE CONVERT(VARCHAR(2), datefield, 108) 
      WHEN @stationStartTime 
      THEN 1 
      ELSE 0 
     END AS sortOrder 
FROM @hourTotalTemp 
WHERE DATEPART(MM, datefield) = 3 
GROUP BY DATEPART(day,datefield)) tbl 
ORDER BY day, sortOrder, hourslot 
0

這會給你一個「圓到小時」日期字段:

dateadd(hour,datediff(hour,0,field),0) 

您可以通過和爲了使用這個組。這往往容易,如果你在一個子查詢中使用它,因爲結果是日期字段如

SELECT 
    -- all the stuff you need using hour_date_field 
FROM 
    (SELECT *, 
     dateadd(hour,datediff(hour,0,datefield),0) as hour_date_field) X 
    FROM table) X 
WHERE DATEPART(MM, hour_date_field) = 3 
GROUP BY hour_date_field 
ORDER BY hour_date_field 

帽尖/更多信息 - 這個問題(和答案):Floor a date in SQL server