Row_number()和group by一起无法正常工作

时间:2018-08-10 11:14:44

标签: sql oracle oracle-sqldeveloper

我在下面的查询中写道,我需要知道我在做什么错。添加row_number()后,输出始终是此错误:

  

ORA-00979:不是GROUP BY表达式
  00979. 00000-“不是GROUP BY表达式”
  *原因:
  *动作:
  错误在行:22列:32

SQL Developer工具提示建议将row_number()Is_Data_Picked分组在一起。但是据我所知,row_number()是一种对每一行进行计数的解析函数,不能在GROUP BY子句中使用

当我在row_number()中使用GROUP BY时,它显示以下错误

  

ORA-30484:缺少此功能的窗口规范
  30484. 00000-“此功能缺少窗口说明”
  *原因:所有窗口功能后均应带有窗口说明,例如()OVER()
  *动作:
  在第26行的错误:第26列

我想在查询中同时使用“ GROUP BY”和“ ROW_NUMBER()”。

请帮助我纠正此问题并提出解决方案。

查询:

SELECT * 
FROM  
    (SELECT 
         COUNT(DISTINCT Emp_Code) totalEmployees,
         SUM(CASE WHEN pay_code = 999 THEN AMOUNT ELSE '0' END) net_salary,
         SUM(CASE WHEN pay_code = 997 THEN AMOUNT ELSE '0' END) gross_earning,
         SUM(CASE WHEN pay_code = 998 THEN AMOUNT ELSE '0' END) gross_deduction,
         Is_Data_Picked,
         ROW_NUMBER() OVER (ORDER BY (Emp_Code)) AS ROW_NUM
     FROM 
         Xxmpcd_Salary_Detail_Table
     WHERE 
         Prayas_Erp_Org_Id LIKE '302-%'
         AND Yyyymm = '201805'
     GROUP BY 
         Is_Data_Picked, ROW_NUMBER()) mytbl
WHERE
    ROW_NUM < 600 AND ROW_NUM > 0

1 个答案:

答案 0 :(得分:2)

这是您的子查询的相关部分:

SELECT . . . 
       ROW_NUMBER() OVER (ORDER BY (Emp_Code)) AS ROW_NUM
FROM Xxmpcd_Salary_Detail_Table
WHERE Prayas_Erp_Org_Id LIKE '302-%' AND Yyyymm = '201805'
GROUP BY Is_Data_Picked, ROW_NUMBER()

您在第一个ROW_NUMBER()中出错,因为Emp_Code不在GROUP BY中。第二个错误是因为ROW_NUMBER()不是一个函数。

我可以推测您打算这样做:

SELECT . . . 
       ROW_NUMBER() OVER (ORDER BY Emp_Code) AS ROW_NUM
FROM Xxmpcd_Salary_Detail_Table
WHERE Prayas_Erp_Org_Id LIKE '302-%' AND Yyyymm = '201805'
GROUP BY Is_Data_Picked, Emp_Code

如果您不想按Emp_Code进行汇总,则可能需要:

SELECT . . . 
       ROW_NUMBER() OVER (ORDER BY MIN(Emp_Code)) AS ROW_NUM
FROM Xxmpcd_Salary_Detail_Table
WHERE Prayas_Erp_Org_Id LIKE '302-%' AND Yyyymm = '201805'
GROUP BY Is_Data_Picked