嵌套选择语句的 SQL GROUP BY

Posted

技术标签:

【中文标题】嵌套选择语句的 SQL GROUP BY【英文标题】:SQL GROUP BY for nested select statements 【发布时间】:2017-08-30 06:37:14 【问题描述】:

以前我有这个查询 -

SELECT 
  COUNT(DISTINCT ds.CLIENTID),
  COUNT(ds.FACID),
  (SUM(ds.NETARREARS) + SUM(ds.TAXARREARS)),
  SUM(ds.UNEARNEDINCOME), 
  SUM(ds.INCOMESUSPENSE) , 
  SUM(ds.VATSUSPENSE) , 
  SUM(ds.PREPAIDDEPOSIT), 
  SUM(ds.NETFUTURE) , 
  SUM(ds.NETEXPOSURE), 
  SUM(ds.PROVISION), 
  SUM(ds.FACILITYSECURITYAMOUNT), 
  SUM(ds.PROVISIONAMOUNTCFWD) 

FROM 
  DAILY_SUMMARY ds 

WHERE
  ds.SUMMARY_DATE = :reportDate AND 
  ds.FACSTS IN('F','L','A') AND 
  ds.PERSTS = 'N';

但后来我们决定删除列

    ds.UNEARNEDINCOME(从上到下第 4 个选择项) ds.PROVISION(从上到下第 10 个选择项)

因为我们有替代查询来获取这些查询,它们是 -

    SELECT SUM(tcs.DUEAMT) FROM TCRENT tcs WHERE tcs.FACID = ds.FACID AND tcs.DUETYPE = 'INT' AND tcs.DUEDATE > :reportDate SELECT sum(pup.PROVISIONAMT) FROM PROVISION_UPLOAD pup WHERE pup.PROVISIONDATE < :reportDate AND pup.FACID = ds.FACID

所以最后的查询是 -

SELECT 
  COUNT(DISTINCT ds.CLIENTID),
  COUNT(ds.FACID),
  (SUM(ds.NETARREARS) + SUM(ds.TAXARREARS)),
  (SELECT SUM(tcs.DUEAMT) FROM TCRENT tcs WHERE tcs.FACID = ds.FACID AND tcs.DUETYPE = 'INT' AND tcs.DUEDATE > :reportDate) AS income, 
  SUM(ds.INCOMESUSPENSE) , 
  SUM(ds.VATSUSPENSE) , 
  SUM(ds.PREPAIDDEPOSIT), 
  SUM(ds.NETFUTURE) , 
  SUM(ds.NETEXPOSURE), 
  (SELECT sum(pup.PROVISIONAMT) FROM PROVISION_UPLOAD pup WHERE pup.PROVISIONDATE < :reportDate AND pup.FACID = ds.FACID) AS prov, 
  SUM(ds.FACILITYSECURITYAMOUNT), 
  SUM(ds.PROVISIONAMOUNTCFWD) 

FROM 
  DAILY_SUMMARY ds 

WHERE
  ds.SUMMARY_DATE = '10-FEB-15' AND 
  ds.FACSTS IN('F','L','A') AND 
  ds.PERSTS = 'N';

但现在问题是将这两个查询与主查询集成,它给出了错误 -

不是单组群功能

意味着它需要 GROUP BY。我尝试了分组,甚至生成了 SQL Developer 建议的分组依据,但它不准确,因为它不完整 -

group by COUNT(DISTINCT, COUNT(ds.FACID), (SUM(ds.NETARREARS), (SELECT,SUM(ds.INCOMESUSPENSE), 
SUM(ds.VATSUSPENSE), SUM(ds.PREPAIDDEPOSIT), SUM(ds.NETFUTURE), SUM(ds.NETEXPOSURE), (SELECT

仅供参考 - 如果 group by 子句和新的 2 个查询被注释,主查询工作正常。

谁能帮我解决这个问题?

更新 - 示例结果截图

【问题讨论】:

您应该提供样本数据和期望的结果。 您应该提供样本数据和期望的结果。 这还开着吗?我一直不明白为什么要在选择列表中使用选择... 改为左连接? 是的,它是开放的,是的,我尝试了左连接.. 但后来我得到 168 的 COUNT(ds.FACID) 而不是 8。我可以通过 COUNT(DISTINCT ds .FACID)。但是 SUM(ds.INCOMESUSPENSE) 和其他金额会增加,我无法通过添加 DISTINCT 来管理。 【参考方案1】:

问题在于您的子查询是相关的子查询

(SELECT sum(pup.PROVISIONAMT)
 FROM PROVISION_UPLOAD pup
 WHERE pup.PROVISIONDATE < :reportDate AND
       pup.FACID = ds.FACID
-------------------^
) AS prov, 

此关联子句使用ds.FACID。但是,此列在聚合后 不可用。

我不确定您真正想要什么结果,因此很难提出解决方案。也许您希望在子查询中再次引用 ds,而不是相关子查询。

【讨论】:

我用以前的版本调试了程序 - 在删除列并获得此记录之前。这在 for 循环中运行。这是我期望的原始结果(如我的问题的查询 1 中)。 [2、4、1577670.0、1025977.03、382470.51、72444.0、0.0、6840996.0、6937774.46、0.0、0.0、1368234.28]

以上是关于嵌套选择语句的 SQL GROUP BY的主要内容,如果未能解决你的问题,请参考以下文章

如何从表中选择带有 oracle sql 中的 group by 子句的嵌套 json 对象?

如何转换 SQL 语句“从没有 someID 的 TABLE 中删除(从 Table group by property1、property2 中选择 someID)

oracle查询选择语句——count、sum、order by、group by

sql语句中 group by用法

在 SQL 中选择不在 Group By 中的列

使用 group by 和 like 语句时如何让 SQL 使用 where 条件