【问题标题】:sql rowcount error despite correct syntax尽管语法正确,但 sql 行计数错误
【发布时间】:2021-03-25 15:07:05
【问题描述】:

我有一张桌子 - t1。此表包含有关材料、每个仓库中的材料数量、该材料的质量和更新日期(数量更新时间)的数据。

我的目标是根据材料的质量在所有仓库中获得总数量的材料。

我的第一步是使用 ROW_NUMBER() 仅使用最新信息。

结果应该是这样的:

我的语法如下:

SELECT * FROM (
select   
ROW_NUMBER() OVER (PARTITION BY UPDATE_DATE, MATERIAL_ID, QUALITY, WAREHOUSE
 ORDER BY UPDATE_DATE desc) AS 'rownum', 
MATERIAL_ID, 
WAREHOUSE,  
 QUALITY, 
SUM(INVENTORY) as INVENTORY_TOTAL
 from t1 ) AS A
where 1=1 and rownum=1
group by rollup (MATERIAL_ID, QUALITY) 
order by MATERIAL_ID desc

但是我得到了错误

选择列表中的“A.rownum”列无效,因为它既不包含在聚合函数中,也不包含在 GROUP BY 子句中。

在我添加 SUM(INVENTORY) as INVENTORY_TOTALgroup by rollup (MATERIAL_ID, QUALITY) 之前 一切正常。 (为了根据rownum得到最实际的数据)

有什么建议吗?

提前谢谢你。

【问题讨论】:

  • 标记你正在使用的数据库。
  • 谢谢,请问您具体是什么意思?
  • 。 .数据库有一个名称,例如 SQL Server、Oracle、DB2、BigQuery、Postgres 等。根据语法,我可能猜到 Postgres 或相关数据库。

标签: sql rollup


【解决方案1】:

您需要在 outer 查询中进行聚合,所以我认为您想要的是:

select MATERIAL_ID, QUALITY, sum(inventory)
from (select t1.*,
             row_number() over (partition by MATERIAL_ID, QUALITY, WAREHOUSE order b update_date desc) as seqnum
      from t1
     ) AS A
where seqnum = 1 
group by rollup (MATERIAL_ID, QUALITY) 
order by MATERIAL_ID desc

请注意,partition by 也会发生变化。您不希望日期出现在窗框规范的那部分。

【讨论】:

  • 非常感谢!您的语法有效,但在结果中我得到每种材料 2 次,其中一行是正确的,但是第二行,例如包含 material_ID=234098, quality= [NULL], quantity = 100 ... 我无法尽管明确声明 ...seqnum = 1 并且质量不是 null 组,但仍要摆脱这些 NULLs。
  • @sqlnewbie 。 . .也许您不希望 quality 出现在 partition by 中。
猜你喜欢
  • 2021-06-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多