SPROC расположить результаты в алфавитном порядке, кроме двух лучших результатов? - PullRequest
0 голосов
/ 27 октября 2009

У меня есть UNIONed запрос, который возвращает:

ReceiptFolderID FolderParentID FolderTypeID FolderType                                         FolderName                                         FolderDescription                                  ReceiptCount
--------------- -------------- ------------ -------------------------------------------------- -------------------------------------------------- -------------------------------------------------- ------------
3               0              1            Pending Receipts                                   Pending Receipts                                   System folder; user cannot delete                  1
7               0              2            Uncategorized Receipts                             Uncategorized Receipts                             System folder; user cannot delete                  2
26              8              3            User-Defined Folder                                European Travel                                    Folders created by users                           0
25              0              3            User-Defined Folder                                Family Receipts                                    Folders created by users                           0



SELECT ReceiptFolderID, FolderParentID, tbl_ReceiptFolders.FolderTypeID, 
        FolderType,
         CASE tbl_ReceiptFolderTypes.FolderTypeID 
             WHEN 1 THEN tbl_ReceiptFolderTypes.FolderType 
             WHEN 2 THEN tbl_ReceiptFolderTypes.FolderType 
             ELSE tbl_ReceiptFolders.FolderName 
         END AS FolderName, 
        tbl_ReceiptFolderTypes.FolderDescription,
        dbo.GetFolderReceiptCount(ReceiptFolderID) AS ReceiptCount
INTO #tmp_UserFolders           
FROM tbl_ReceiptFolders LEFT JOIN tbl_ReceiptFolderTypes ON tbl_ReceiptFolders.FolderTypeID=tbl_ReceiptFolderTypes.FolderTypeID
WHERE UserID=@UserID 
AND (tbl_ReceiptFolderTypes.FolderTypeID = 1 
     OR tbl_ReceiptFolderTypes.FolderTypeID = 2)
--ORDER BY tbl_ReceiptFolderTypes.FolderTypeID ASC

UNION

SELECT ReceiptFolderID, FolderParentID, tbl_ReceiptFolders.FolderTypeID, 
        FolderType,
         CASE tbl_ReceiptFolderTypes.FolderTypeID 
             WHEN 1 THEN tbl_ReceiptFolderTypes.FolderType 
             WHEN 2 THEN tbl_ReceiptFolderTypes.FolderType 
             ELSE tbl_ReceiptFolders.FolderName 
         END AS FolderName, 
        tbl_ReceiptFolderTypes.FolderDescription,
        dbo.GetFolderReceiptCount(ReceiptFolderID) AS ReceiptCount
INTO #tmp_UserFolders
FROM tbl_ReceiptFolders LEFT JOIN tbl_ReceiptFolderTypes ON tbl_ReceiptFolders.FolderTypeID=tbl_ReceiptFolderTypes.FolderTypeID
WHERE UserID=@UserID 
AND (tbl_ReceiptFolderTypes.FolderTypeID <> 1 
     OR tbl_ReceiptFolderTypes.FolderTypeID <> 2)

Как вы можете видеть, ожидающие и некатегоризованные квитанции всегда будут появляться сначала, а затем все остальные в алфавитном порядке.

Теперь, добавить это в SPROC, что я и сделал с папками #temp, не работает.

Какой способ обойти это, чтобы sproc вернул эти результаты?

Спасибо!

1 Ответ

1 голос
/ 27 октября 2009

Во втором запросе у вас есть

(tbl_ReceiptFolderTypes.FolderTypeID <> 1          
 OR tbl_ReceiptFolderTypes.FolderTypeID <> 2)

Хорошо, подумайте об этом ... Каждая запись будет удовлетворять этому предикату. Независимо от значения FolderTypeID, это тот случай, когда он не равен 1 или не равен 2.

Если я правильно понимаю, что вы хотите, попробуйте это:

Select ReceiptFolderID, FolderParentID,
    f.FolderTypeID, FolderType,
  Case t.FolderTypeID 
    When 1 Then t.FolderType
    When 2 Then t.FolderType                          
    Else f.FolderName End FolderName,   
  t.FolderDescription,
  dbo.GetFolderReceiptCount(ReceiptFolderID) ReceiptCount    
From tbl_ReceiptFolders f
   Left Join tbl_ReceiptFolderTypes t
       On f.FolderTypeID = t.FolderTypeID
Where UserID = @UserID 
Order By Case When t.FolderTypeID In (1,2) 
           Then 0 Else 1 End

Отредактируйте, чтобы добавить Count (), попробуйте это:

Select ReceiptFolderID, FolderParentID,
    f.FolderTypeID, FolderType,
  Case t.FolderTypeID 
    When 1 Then t.FolderType
    When 2 Then t.FolderType                          
    Else f.FolderName End FolderName,   
  t.FolderDescription,
  Count(h.ReceiptFolderID) ReceiptCount    
From tbl_ReceiptFolders f
   Left Join tbl_ReceiptFolderTypes t
       On f.FolderTypeID = t.FolderTypeID
   Left Join tbl_ReceiptFolderLnk h 
       On h.ReceiptFolderID = f.ReceiptFolderID
Where UserID = @UserID
Group By ReceiptFolderID, FolderParentID,
    f.FolderTypeID, FolderType, t.FolderDescription,
  Case t.FolderTypeID 
    When 1 Then t.FolderType
    When 2 Then t.FolderType                          
    Else f.FolderName End,          
  Case When t.FolderTypeID In (1,2) 
    Then 0 Else 1 End
Order By Case When t.FolderTypeID In (1,2) 
           Then 0 Else 1 End
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...