2009-10-27 5 views
0

J'ai une requête qui retourne filles fusionnées:SPROC pour organiser les résultats par ordre alphabétique, sauf les deux premiers résultats?

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 [email protected] 
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 [email protected] 
AND (tbl_ReceiptFolderTypes.FolderTypeID <> 1 
    OR tbl_ReceiptFolderTypes.FolderTypeID <> 2) 

Comme vous pouvez le voir, en attente et reçus Non classé apparaît toujours d'abord, puis le reste, en ordre alphabétique.

Maintenant, pour lancer ceci dans un SPROC, ce que j'ai fait avec les dossiers #temp ne fonctionne pas.

Comment se fait-il que le sproc renvoie ces résultats?

Merci!

+0

Je ne vois pas comment cette UNION pourrait fonctionner! – Nestor

+0

Que voulez-vous dire "ne fonctionne pas" ... que fait-il? –

+0

Chris ... si vous supprimez les lignes INTO ... cela fonctionne, mais la réponse ci-dessous est beaucoup plus élégante. – ElHaix

Répondre

1

Dans votre deuxième requête, vous avez

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

Eh bien, pensez à ce sujet ... Chaque dossier satisfera ce prédicat .. Quelle que soit la valeur de FolderTypeID est, il est vrai que c'est soit pas 1, ou ce n'est pas 2.

Si je comprends ce que vous voulez bien, essayez ceci:

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 

Modifier pour ajouter Count() essayez ceci:

Lorsque vous utilisez INTO la clause SELECT ne retournera pas d'enregistrements.
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 
+0

Parfait, merci! Comme vous pouvez le voir le compte de réception est pour ce dossier, mais pas pour les dossiers enfants. Comment obtenir le compte de réception de tous les dossiers enfants? ie. Divers (3) /Misc1.0 (0) /Misc1.1 (1) /Misc2.0 (2) Merci! – ElHaix

+0

Sans voir dbo.GetFolderReceiptCount(), il n'y a aucun moyen de hasarder une supposition ... Mais à quelle table sont les recettes? Est-ce tbl_ReceiptFolders? ou a-t-il un FK à tbl_ReceiptFolders? –

+0

Charles - voici la nouvelle question: http://stackoverflow.com/questions/1633872/how-to-get-the-item-count-for-sub-categories-on-each-parent Merci! – ElHaix

Questions connexes