全部的

我对下面的查询有问题.我试图从我们的数据库中获取过go 3年的统计数据,但我不断收到错误消息:

***Column 'OC_VDATA.DATA1' is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause.***

我知道这与DATA1列有关,但我对使用PERCENTILE\u CONT函数不太熟悉,不知道解决方案是什么.

有人有什么 idea 吗?

WITH Q AS
(
    SELECT        stagingPLM.dbo.ITEM_CODES.ITEM_CODE, 
                    AVG(OC_VDATA.DATA1) AS Mean, 
                    STDEVP(OC_VDATA.DATA1) AS StandardDev,
                    PERCENTILE_CONT(0.5) 
                        WITHIN GROUP (ORDER BY OC_VDATA.DATA1) 
                        OVER (PARTITION BY stagingPLM.dbo.ITEM_CODES.ITEM_CODE) AS Median
    FROM            OC_VDATA INNER JOIN
                             OC_VDAT_AUX ON OC_VDATA.PARTNO = OC_VDAT_AUX.PARTNOAUX 
                                AND OC_VDATA.DATETIME = OC_VDAT_AUX.DATETIMEAUX INNER JOIN
                             stagingPLM.dbo.ITEM_CODES ON LEFT(OC_VDATA.PARTNO, 12) = stagingPLM.dbo.ITEM_CODES.SPEC_NO 
                                AND LEFT(OC_VDAT_AUX.PARTNOAUX, 12) = stagingPLM.dbo.ITEM_CODES.SPEC_NO
    WHERE        (OC_VDAT_AUX.UDL28 LIKE '%PLASTIC%') 
                    AND (RIGHT(OC_VDATA.PARTNO, 6) = '036150')
                    AND (CAST(OC_VDAT_AUX.UDL40 AS DATETIME)
                        BETWEEN CONVERT(datetime, '2019-05-18 00:00:00', 102) AND CONVERT(datetime, '2022-05-18 00:00:00', 102))
    GROUP BY stagingPLM.dbo.ITEM_CODES.ITEM_CODE
)

SELECT * FROM Q

推荐答案

错误是因为代码WITHIN GROUP (ORDER BY OC_VDATA.DATA1).

最好使用窗口函数来计算AVGSTDEVPPERCENTILE_CONT,而不是半通分组和半通窗口函数.

通过考虑再现问题所需的最少列,您可以按如下所示重写查询以获得所需的输出.

SELECT DISTINCT item_codes.item_code,
                Avg(oc_vdata.data1)
                  over(
                    PARTITION BY item_codes.item_code) AS Mean,
                Stdevp(oc_vdata.data1)
                  over(
                    PARTITION BY item_codes.item_code) AS StandardDev,
                Percentile_cont(0.5)
                  within GROUP (ORDER BY oc_vdata.data1) over (
                    PARTITION BY item_codes.item_code) AS Median
FROM   oc_vdata
       inner join item_codes
               ON Left(oc_vdata.partno, 12) = item_codes.spec_no 

DB小提琴:Try it here

Minimum steps to reproduce the error:

SELECT item_codes.item_code,
       Avg(oc_vdata.data1)    AS Mean,
       Stdevp(oc_vdata.data1) AS StandardDev
FROM   oc_vdata
       INNER JOIN item_codes
               ON LEFT(oc_vdata.partno, 12) = item_codes.spec_no
GROUP  BY item_codes.item_code
ORDER  BY oc_vdata.data1 -- This will cause the error

Sql相关问答推荐

如何查询一个名称是根据PL/pgSQL函数结果构建的表?

GROUP BY和GROUP_CONCAT用于计算比赛排名

返回包含列和包含其他列的列表的自定义查询

编写一个SQL查询来返回收视率较高的类型,并取这些收视率的平均值,我该如何做呢?

检索上一个星期四和上一个星期三

PostgreSQL:按小时查看调整日期

每年独特口味的冰淇淋数量

来自按PostgreSQL分组的最小日期

按连续相等值分组排序

在VB.NET中如何在MS Access数据库中创建SQL项目历史库存卡

排除具有部分匹配条件的记录

在SQL中将项分配给容器

SQL查询正在工作,但返回空结果

PostgreSQL:从多个字段收集特定指标的最后一个条目

复制行并根据 Oracle SQL 中其他表的值更改值

如何为 ActiveRecord 联接应用附加条件

如何使用 join 和 where 子句从另一表中仅删除一个表中的值

自动生成计算频率的列

我需要遍历权重值表并确定每个权重是否有效

连接表时避免重复