2015-03-19 65 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订购。