订单不使用Top MS SQL Query

jee*_*ers 0 mysql sql-server sorting datatable

我正在创建一个适合我正在使用的MsSQL的DataTable的查询.这是我第一次使用MsSQL,所以我试图从我的MySQL中找出等效的MsSQL查询.

我做了一个自定义查询,将LIMITMySQL中的函数处理到MsSQL(希望如此).我在我的数据表中使用以下查询:

    SELECT * FROM (
        SELECT top 20 CAST(DATEPART(YEAR,[DeliveryDate]) as varchar) + ' Week ' + CAST(DATEPART(WEEK,[DeliveryDate]) AS varchar) AS week_name, 
        AVG(DATEDIFF(day, CONVERT(date, [UnloadDate]), CONVERT(date, [DeliveryDate]))) as Average_Delivery_Days
        FROM [CARGODB].[dbo].[Cargo_Transactions] 
        WHERE [DeliveryDate] IS NOT NULL AND [DeliveryDate] != 0 
        AND [UnloadDate] IS NOT NULL AND [UnloadDate] != 0 AND [DeliveryDate] > [UnloadDate] AND [Deleted] = 0 and [StageID] = 'D' 
        AND [RouteID] IS NOT NULL AND [RouteID] != '' AND CONVERT(date, [DeliveryDate]) BETWEEN '2016-01-01' AND GETDATE() 
        AND CONVERT(date, [DeliveryDate]) >= DATEADD(week, -24, getdate()) 
        GROUP BY DATEPART(YEAR,[DeliveryDate]), DATEPART(WEEK,[DeliveryDate]) 
        ORDER BY CAST(DATEPART(YEAR,[DeliveryDate]) as varchar) + ' Week ' + CAST(DATEPART(WEEK,[DeliveryDate]) AS varchar) ASC
    ) as foo
    except
    SELECT * FROM (
        SELECT top 10 CAST(DATEPART(YEAR,[DeliveryDate]) as varchar) + ' Week ' + CAST(DATEPART(WEEK,[DeliveryDate]) AS varchar) AS week_name, 
        AVG(DATEDIFF(day, CONVERT(date, [UnloadDate]), CONVERT(date, [DeliveryDate]))) as Average_Delivery_Days
        FROM [CARGODB].[dbo].[Cargo_Transactions] 
        WHERE [DeliveryDate] IS NOT NULL AND [DeliveryDate] != 0 
        AND [UnloadDate] IS NOT NULL AND [UnloadDate] != 0 AND [DeliveryDate] > [UnloadDate] AND [Deleted] = 0 and [StageID] = 'D' 
        AND [RouteID] IS NOT NULL AND [RouteID] != '' AND CONVERT(date, [DeliveryDate]) BETWEEN '2016-01-01' AND GETDATE() 
        AND CONVERT(date, [DeliveryDate]) >= DATEADD(week, -24, getdate()) 
        GROUP BY DATEPART(YEAR,[DeliveryDate]), DATEPART(WEEK,[DeliveryDate]) 
        ORDER BY CAST(DATEPART(YEAR,[DeliveryDate]) as varchar) + ' Week ' + CAST(DATEPART(WEEK,[DeliveryDate]) AS varchar) ASC
    ) as bar
Run Code Online (Sandbox Code Playgroud)

结果是:

week_name     | Average_Delivery_Days
==================================
2017 Week 36  | 15
2017 Week 39  | 11
2017 Week 41  | 13
2017 Week 42  | 10
2017 Week 38  | 12
2017 Week 40  | 12
2017 Week 35  | 14
2017 Week 43  | 6
2017 Week 37  | 12
2017 Week 44  | 9
Run Code Online (Sandbox Code Playgroud)

但我希望它按周数递增排序,因此它应显示36,37,38,39等.

我的查询中可能缺少什么?

我感谢您的帮助.谢谢!

Dav*_*man 6

您的ORDER BY子句仅影响TOP选择; 它不会对结果集进行排序.在查询结尾添加ORDER BY应该可以解决问题.

然而,我确实看到了另一个问题,那就是你将要在其中对包含数字的VARCHAR列进行排序.VARCHAR按字母顺序排序,因此第2周将出现在第19周之后.所以我会这样做:

SELECT 
/* Explicitly select these columns */
week_name
, Average_Delivery_Days


FROM (
    SELECT top 20
    /* Add separate columns for numerical year and week */
     iyear = YEAR(DeliveryDate)
    , iweek = DATEPART(WEEK,DeliveryDate)
    , CAST(DATEPART(YEAR,[DeliveryDate]) as varchar) + ' Week ' + CAST(DATEPART(WEEK,[DeliveryDate]) AS varchar) AS week_name, 
    AVG(DATEDIFF(day, CONVERT(date, [UnloadDate]), CONVERT(date, [DeliveryDate]))) as Average_Delivery_Days
    FROM [CARGODB].[dbo].[Cargo_Transactions] 
    WHERE [DeliveryDate] IS NOT NULL AND [DeliveryDate] != 0 
    AND [UnloadDate] IS NOT NULL AND [UnloadDate] != 0 AND [DeliveryDate] > [UnloadDate] AND [Deleted] = 0 and [StageID] = 'D' 
    AND [RouteID] IS NOT NULL AND [RouteID] != '' AND CONVERT(date, [DeliveryDate]) BETWEEN '2016-01-01' AND GETDATE() 
    AND CONVERT(date, [DeliveryDate]) >= DATEADD(week, -24, getdate()) 
    GROUP BY DATEPART(YEAR,[DeliveryDate]), DATEPART(WEEK,[DeliveryDate]) 
    ORDER BY CAST(DATEPART(YEAR,[DeliveryDate]) as varchar) + ' Week ' + CAST(DATEPART(WEEK,[DeliveryDate]) AS varchar) ASC
) as foo
except
SELECT * FROM (
    SELECT top 10 CAST(DATEPART(YEAR,[DeliveryDate]) as varchar) + ' Week ' + CAST(DATEPART(WEEK,[DeliveryDate]) AS varchar) AS week_name, 
    AVG(DATEDIFF(day, CONVERT(date, [UnloadDate]), CONVERT(date, [DeliveryDate]))) as Average_Delivery_Days
    FROM [CARGODB].[dbo].[Cargo_Transactions] 
    WHERE [DeliveryDate] IS NOT NULL AND [DeliveryDate] != 0 
    AND [UnloadDate] IS NOT NULL AND [UnloadDate] != 0 AND [DeliveryDate] > [UnloadDate] AND [Deleted] = 0 and [StageID] = 'D' 
    AND [RouteID] IS NOT NULL AND [RouteID] != '' AND CONVERT(date, [DeliveryDate]) BETWEEN '2016-01-01' AND GETDATE() 
    AND CONVERT(date, [DeliveryDate]) >= DATEADD(week, -24, getdate()) 
    GROUP BY DATEPART(YEAR,[DeliveryDate]), DATEPART(WEEK,[DeliveryDate]) 
    ORDER BY CAST(DATEPART(YEAR,[DeliveryDate]) as varchar) + ' Week ' + CAST(DATEPART(WEEK,[DeliveryDate]) AS varchar) ASC
) as bar
 /* sort by the numeric columns */
 ORDER BY foo.iyear, foo.iweek
Run Code Online (Sandbox Code Playgroud)