当 Select distinct From Features 给出错误 ORDER BY items must appear in the select list?

When Select distinct From Features give Error ORDER BY items must appear in the select list?

我处理 SQL 服务器 2012 查询我遇到问题:

error ORDER BY items must appear in the select list if SELECT DISTINCT is specified

请问如何解决这个问题?

在我的解决方案中,我在 DkFeatureName 中重复了更多功能,因此我需要 select 仅不同。

特征,这将防止重复列。

create table #nonparametricdata
(
    PART_ID nvarchar(50) ,
    CompanyName  nvarchar(50),
    PartNumber nvarchar(50),
    DKFeatureName nvarchar(100),
    Tempvalue nvarchar(50),
    StatusId int,
    DisplayOrder int,
    FlagAllow bit
)

insert into #nonparametricdata
values
('1222','Honda','silicon','package','15.50Am',3,4,0),
('1900','MERCEIS','GLASS','family','90.00Am',2,3,1),
('5000','TOYOTA','alominia','source','70.20kg',3,5,0),
('8000','MACDA','motor','parametric','50.40kg',2,1,1),
('8900','JEB','mirror','noparametric','75.35kg',2,6,0),
('8000','MACDA','motor','parametric','50.40kg',2,2,1)

DECLARE @Header NVARCHAR(MAX)
SELECT
    @Header = STUFF(
        (
            SELECT distinct ', ' +  case when A.splitFlag = 1 then ''''+A.DKFeatureName +''' as '''+A.DKFeatureName+''','''+ A.DKFeatureName + 'Units'  +''' as ''' + A.DKFeatureName +'Units' +'''' else ''''+A.DKFeatureName +''' as ''' + A.DKFeatureName +''''    end
            FROM #FinalTable A
            where StatusId=2
        
            ORDER BY DisplayOrder
            FOR XML PATH ('')
        ),1,2,''
    )
    SELECT @Header

不使用 DISTINCT,而是使用 GROUP BY 子句。这允许您对聚合的缺失列进行 ORDER BY。原理

SELECT A, B
GROUP BY A, B
ORDER BY MAX(C)

或者简单地按照错误消息的建议进行操作:将 DisplayOrder 包含在 select 列表中。

SELECT distinct DisplayOrder, ', ' +  case when A.splitFlag = 1 then ''''+A.DKFeatureName ...

问题是 DISTINCT 可能会丢弃一些行。因此,如果 DisplayOrder 在这些其他方面相同的行中不同,那么应该使用其中哪一个进行排序?使用 GROUP BY,您可以指定是哪一个。在我的示例中,它将是 MAX(DisplayOrder),即在不同的行中最大的。它也可以是 MIN()AVG() 或其他什么。

就错误消息而言,我想说的是,这条错误消息几乎是不言自明的。要解释为什么会这样,请考虑以下数据:

Name        DisplayOrder
-----------------------------
Name 1          1
Name 1          4
Name 2          3
Name 2          2

然后我们想要不同的名称,按 DisplayOrder:

排序
SELECT DISTINCT Name
FROM T
ORDER BY DisplayOrder

由于每个名字有两个DisplayOrder值,SQL服务器不知道选择哪个,选择哪个会影响结果的顺序,所以必须告诉它选择哪一个。

我通常会将 DISTINCT 换成 GROUP BY 并使用聚合:

SELECT Name
FROM T
GROUP BY Name
ORDER BY MIN(DisplayOrder);

在你的情况下,我想你最终会得到这样的结果:

DECLARE @Header NVARCHAR(MAX)
SELECT
    @Header = STUFF(
        (
            SELECT ', ' +  case when A.splitFlag = 1 then ''''+A.DKFeatureName +''' as '''+A.DKFeatureName+''','''+ A.DKFeatureName + 'Units'  +''' as ''' + A.DKFeatureName +'Units' +'''' else ''''+A.DKFeatureName +''' as ''' + A.DKFeatureName +''''    end
            FROM #FinalTable A
            where StatusId=2
            GROUP BY A.SplitFlag, A.DKFeatureName
            ORDER BY MIN(DisplayOrder)
            FOR XML PATH ('')
        ),1,2,''
    )
    SELECT @Header