2016-12-02 27 views
2

需要使用DISTINCT和ORDER BY子句返回SQL中的臨時表,並將其連接到另一個臨時表。如果使用distinct,則按項目排序必須出現在選擇列表中

我有一個表格,它返回一些東西。

Declare @GrpItems TABLE (ID INT, 
         Name NVARCHAR(32), 
         Date DATETIME, 
         City NVARCHAR(32), 
         CityCode NVARCHAR(8), 
         CurrencySort NVARCHAR(16) 
         ) 

INSERT INTO @GrpItems 
    SELECT 
     ID, Name, Date , 
     CityCodeorCaption --this can be two type based on User input CityCode or CityCaption 
    FROM 
     RepeatItemTable 

現在我有一個不同的表,我想要插入並且過程返回該表作爲最終結果。

DECLARE @CurrencyTable TABLE (RowNumber INT Identity (1,1), 
           FK_Currency INT, 
           Value INT, 
           CityCode NVARCHAR(16), 
           CityCaption NVARCHAR(16) 
          ) 

INSERT INTO @Currency 
    SELECT DISTINCT 
     gb.FK_Currency, cv.Value, 
     c.CityCode, c.CityCaption 
    FROM 
     Balance b 
    JOIN 
     Currency c ON c.PK_Currency = b.FK_Currency 
    JOIN 
     @GrpItems gi ON c.FK_Grpitem = gi.PK_Grpitem 
    ORDER BY 
     gi.CityCodeorName  

我知道我的地方通過需要組,但我不知道,或者在過濾器

我覺得

ORDER BY 
    gi.CityCodeOrNAME 
     WHEN 'City' THEN City 
     ELSE CityCode ASC 
     END  

一個選擇條款似乎沒有哪個工作?我需要獨特的,因爲它可能會破壞一些其他的邏輯。

Select * from @CurrencyTable 

回答

1

您可以隨時使用group by代替select distinct。這將解決你的問題:

SELECT gb.FK_Currency, cv.Value, c.CityCode, c.CityCaption 
FROM Balance b JOIN 
    Currency c 
    ON c.PK_Currency = b.FK_Currency JOIN 
    @GrpItems gi 
    ON c.FK_Grpitem = gi.PK_Grpitem 
GROUP BY gb.FK_Currency, cv.Value, c.CityCode, c.CityCaption 
ORDER BY MAX(gi.CityCodeorName) ; 

注意在ORDER BY使用聚合功能的。

0
ORDER BY CASE WHEN CityCodeOrNAME = 'City' 
       THEN City 
       ELSE CityCode 
     END 

如果你需要不同的充要你也可以把它們分開

ORDER BY CASE WHEN CityCodeOrNAME = 'City' THEN City END DESC, 
     CASE WHEN CityCodeOrNAME <> 'City' THEN CityCode END ASC 
相關問題