如果使用distinct,则按项目排序必须出现在选择列表中

时间:2016-12-02 02:47:58

标签: sql sql-server

需要在SQL中使用DISTINCT和ORDER BY子句返回另一个临时表中的临时表。

我声明了一个返回一些东西的表。

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    

我知道我需要分组的地方,但我不确定或者过滤器

中的select子句

我认为

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

哪个似乎不起作用?我需要Distinct因为它可能打破其他一些逻辑。

Select * from @CurrencyTable

2 个答案:

答案 0 :(得分: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中使用聚合函数。

答案 1 :(得分: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