C# 按日期排序的订单在我的项目中不起作用

C# 按日期排序的订单在我的项目中不起作用,c#,asp.net,sql-server-2008,C#,Asp.net,Sql Server 2008,我正在从事一个C#/ASP.NET项目,并使用SQL Server作为后端 我编写了一个查询,以获得每月和每年的“总销售额”的详细信息,即mm-yyyy格式,我想按升序排序 但查询不会按升序对其结果进行排序 我的问题是 /* TOTAL SALE*/ SELECT CAST((Datepart(Month, [p].Transdate)) AS varchar(50)) +'-'+ CAST((Datepart(Year, [p].Transdate)) AS varcha

我正在从事一个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
请帮忙


提前感谢您。

因为您将日期转换为字符串,所以您得到的是字典顺序,而不是日期。所以不要投下它:

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 

但是,由于您使用的是
groupby
,因此必须告诉SQL Server您希望从每个组的哪一行执行
转换日期。我只是简单地使用了
MIN(transdate)
,这是一个月的开始。

因为您将日期转换为字符串,您得到的是字典顺序,而不是日期。所以不要投下它:

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 
但是,由于您使用的是
groupby
,因此必须告诉SQL Server您希望从每个组的哪一行执行
转换日期。我只是简单地使用了
MIN(transdate)
这是一个月的开始。

为什么要“格式化”您要订购的日期

Cast((Datepart(Month,[p].Transdate)) as varchar(50)) + '-'+
Cast((Datepart(Year,[p].Transdate))as varchar(50)) ASC
本订单将该零件视为varchar(50)。只需按Transdate订购。

为什么要“格式化”要按日期订购的日期

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

本订单将该零件视为varchar(50)。只需按Transdate订购。

您订购的字符串与订购int或date不同。。。Cast-in-order-by子句不是必需的-只要order-by[p]。Transdate犯了我的错误。在我的表中,日期是yyyy-mm-dd格式,而我是以mm-yyyy格式转换的,这是order by不起作用的原因。Transdate的数据类型?Transdate是列名您正在排序的字符串与排序int或date不起作用。。。Cast-in-order-by子句不是必需的-只要order-by[p]。Transdate犯了我的错误。在我的表中,日期是yyyy-mm-dd格式,我是以mm-yyyy格式转换的,这是order by无法工作的原因。Transdate的数据类型?Transdate是列名