2015-03-19 66 views
0

我正在C#/ ASP.NET項目上工作,我正在使用SQL Server作爲我的後端。排序依據日期不能在我的項目中工作

我已經寫了一個查詢來獲取每月和每年的'總銷售額'的詳細信息,即mm-yyyy格式,我想按升序排序。

但是,查詢不會按升序對結果進行排序。

我的查詢是

/* TOTAL SALE*/ 
SELECT 
    CAST((Datepart(Month, [p].Transdate)) AS varchar(50)) +'-'+ 
    CAST((Datepart(Year, [p].Transdate)) AS varchar(50)) AS [Month/Year], 
    SUM([p].Litres) [Total Sale] 
FROM 
    CustomerPoints AS [p] 
INNER JOIN 
    Customers AS [c] ON [c].[CustomerID] = [p].[CustomerID] 
WHERE 
    [p].Transdate BETWEEN '2013-01-20' AND '2015-03-05' 
    AND [c].DistributorID = '1' 
GROUP BY 
    CAST((Datepart(Month, [p].Transdate)) AS varchar(50)) + '-'+ 
    CAST((Datepart(Year, [p].Transdate)) AS varchar(50)) 
ORDER BY 
    CAST((Datepart(Month, [p].Transdate)) AS varchar(50)) + '-'+ 
    CAST((Datepart(Year, [p].Transdate)) AS varchar(50)) ASC 

上述查詢的輸出是

Month/Year Total Sale 
-------------------------- 
1-2013   600 
1-2014   2300 
10-2014   0 
2-2015   1560 
3-2014   80 
3-2015   700 

請幫助。

預先感謝您。

+3

您正在訂購的字符串不工作就像訂購int或日期一樣...按子句順序投入並不是壞事 - 只是按[p]排序.Transdate – MajkeloDev 2015-03-19 09:59:29

+0

得到了我的錯誤。在我的表格中,日期格式爲yyyy-mm-dd格式,而且我以mm-yyyy格式進行投影,這是由於順序不起作用的原因。 – 2015-03-19 10:17:27

+0

Transdate的DataType? – 2015-03-19 10:33:15

回答

3

因爲您將日期轉換爲字符串,您可以使用字典順序而不是日期。所以,不要將其丟:

SELECT Cast((Datepart(month, [p].transdate)) AS VARCHAR(50)) 
     + '-' 
     + Cast((Datepart(year, [p].transdate))AS VARCHAR(50)) AS [Month/Year], 
     Sum([p].litres)          [Total Sale] 
FROM customerpoints AS [p] 
     INNER JOIN customers AS [c] 
       ON [c].[customerid] = [p].[customerid] 
WHERE [p].transdate BETWEEN '2013-01-20' AND '2015-03-05' 
     AND [c].distributorid = '1' 
GROUP BY Cast((Datepart(month, [p].transdate)) AS VARCHAR(50)) 
      + '-' 
      + Cast((Datepart(year, [p].transdate))AS VARCHAR(50)) 
ORDER BY MIN(transdate) ASC 

但因爲你正在使用Group By你必須從你想採取什麼transdate排每組告訴SQL-Server中。我簡單地使用了本月初的MIN(transdate)

1

爲什麼要「格式化」您要訂購的日期?

Cast((Datepart(Month,[p].Transdate)) as varchar(50)) + '-'+ 
Cast((Datepart(Year,[p].Transdate))as varchar(50)) ASC 

這將命令關於該部分作爲varchar(50)。只需通過Transdate訂購。