2013-10-29 57 views
1

我希望按SELECT順序返回SELECTed查詢。這是什麼目前正在返回:SELECT查詢不按所需順序返回

enter image description here

這裏是當前查詢:

SELECT 
    [Number] + ' - ' + SUBSTRING([Title], 1, 40) AS [StoryName] 
    ,[PK_Story] 
FROM Story STY 
INNER JOIN Task TSK ON TSK.StoryId = STY.PK_Story 
INNER JOIN DailyTaskHours DTH ON DTH.TaskId = TSK.PK_Task 
WHERE ProductId = @productIdParam 
    AND DTH.ActivityDate BETWEEN @startDateParam 
     AND @endDateParam 
GROUP BY [Number] 
    ,[Number] + ' - ' + SUBSTRING([Title], 1, 40) 
    ,[PK_Story] 
HAVING SUM(DTH.[Hours]) > 0 
ORDER BY [Number] ASC 

我試圖通過[Number]這是CMIS命令 - ##。正如你可以看到我有ORDER BY嘗試這樣做,但結果順序不正確。較低的值'CMIS-43'不在最上面。我該如何解決?

編輯:

這是最終我的解決辦法來處理的[Number]可變長度:

SELECT [Number] + ' - ' + SUBSTRING([Title], 1, 40) AS [StoryName] 
     ,[PK_Story] 
FROM Story STY 
INNER JOIN Task TSK ON TSK.StoryId = STY.PK_Story 
INNER JOIN DailyTaskHours DTH ON DTH.TaskId = TSK.PK_Task 
WHERE ProductId = @productParam 
     AND DTH.ActivityDate BETWEEN @startDateParam 
      AND @endDateParam 
GROUP BY [Number] 
    ,[Number] + ' - ' + SUBSTRING([Title], 1, 40) 
    ,[PK_Story] 
HAVING SUM(DTH.[Hours]) > 0 
ORDER BY CAST(SUBSTRING([Number], CHARINDEX('-',[Number]) + 1, LEN([Number])) AS INT) 
+1

號碼不是數字值是一個字符串,返回的順序是好的,只要被視爲一個字符串即可。在一個字符串中,以3開頭的任何數字都會出現在以4開頭的任何數字之前,不管它是3000還是43。 – Gonzix

+0

'ORDER BY Convert(BigInt,[Number])ASC' ...可能想要添加一個ISNUMERIC給它,並將它們設置爲某個默認值 –

回答

2
ORDER BY CAST(SUBSTRING([Number], 6, LEN([number])-5) AS INT) 
+0

雖然我對它進行了升級,但只有在第一個數字之前的非數字字符總數始終爲5時才能使用。 –

1

[號碼]是一個字符串/ VARCHAR,所以排序是詞典(字母),而不是數字。

3

問題是您的列表正在被排序爲一個字符串,並且您希望它按數字順序排序。

嘗試這樣:

SELECT [Number] + ' - ' + SUBSTRING([Title], 1, 40) AS [StoryName] 
    ,[PK_Story], CAST(SUBSTRING([Number], 5, 3) AS int) AS [CMNumber] 
FROM Story STY 
INNER JOIN Task TSK ON TSK.StoryId = STY.PK_Story 
INNER JOIN DailyTaskHours DTH ON DTH.TaskId = TSK.PK_Task 
WHERE ProductId = @productIdParam 
    AND DTH.ActivityDate BETWEEN @startDateParam 
     AND @endDateParam 
GROUP BY [Number] 
    ,[Number] + ' - ' + SUBSTRING([Title], 1, 40) 
    ,[PK_Story] 
HAVING SUM(DTH.[Hours]) > 0 
ORDER BY CMNumber ASC 
0

你的問題的根源是,你正在嘗試做的文本數字排序。換句話說,當數字10大於數字9時,字符串「9」大於字符串「10」。

要解決這個問題,你需要另外一個字段來選擇你的select和group by子句。該字段將使用字符串函數來獲取數字字段的數字部分,然後將其轉換爲整數。我會把細節留給你。