【问题标题】:Subquery distinct field子查询不同字段
【发布时间】:2018-01-18 17:40:37
【问题描述】:

您好,我正在学习编写 sql 查询,我正在尝试查询分类帐表以选择字段“ENCID”,其中每个不同的 ENCID 在单独的文件“TDATE”中有超过 4 个不同的值。 然后按第三个字段“ITEMTYPE”过滤

这就是我所拥有的:

SELECT 
      [ENCID]
      ,[PATIENTID]
      ,[ITEMTYPE]
      ,[Service Date]
      ,[Transaction Date]
      ,[Trans]
      ,[PracticeName]

  FROM TABLE1
WHERE ITEMTYPE = 'S'
AND ENCID IN (SELECT ENCID FROM TABLE1 WHERE Count(Distinct [Transaction Date]) >4 
AND ITEMTYPE = 'S')

我收到此错误“DataSource.Error:Microsoft SQL:聚合可能不会出现在 WHERE 子句中,除非它位于 HAVING 子句或选择列表中包含的子查询中,并且正在聚合的列是外部引用。”

【问题讨论】:

  • 这是mysql还是MS SQL?
  • 阅读错误信息。它说您需要使用 HAVING 才能使用聚合函数。您不能将COUNT 放在WHERE 子句中。
  • 这不是 MySQL。请修改您的标签

标签: sql-server subquery


【解决方案1】:

试试这个:

SELECT 
      [ENCID]
      ,[PATIENTID]
      ,[ITEMTYPE]
      ,[Service Date]
      ,[Transaction Date]
      ,[Trans]
      ,[PracticeName]    
FROM TABLE1
WHERE ITEMTYPE = 'S'
   AND ENCID IN (
      SELECT ENCID 
      FROM TABLE1 
      WHERE ITEMTYPE = 'S'
      GROUP BY ENCID
      HAVING Count(Distinct [Transaction Date]) >4 
         AND MAX ([Transaction Date]) - MIN ([Transaction Date]) > 60
     )

一般情况下,聚合函数只能在SELECTHAVINGORDER BY 子句中使用(因为 WHERE 确定要聚合哪些记录)。

错误消息令人惊讶地详细阐述了 WHERE 可能包含聚合函数的独特情况。比如这样:

SELECT a.id
FROM a
GROUP BY a.id
HAVING a.id IN (
  SELECT b.a_id
  FROM b
  WHERE b.total = COUNT(a.something)
)

【讨论】:

  • 更进一步,我如何从上面的结果中选择 ENCID 的 MAX ([Transaction Date]) - MIN ([Transaction Date]) > 60?
  • 查看编辑;您可以使用几乎与 WHERE 相同的 HAVING(具有多个条件等),它的条件仅在计算聚合之后应用,而不是之前应用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-02-22
  • 2020-11-21
  • 1970-01-01
  • 2020-07-02
  • 1970-01-01
  • 2013-03-15
  • 2014-10-11
相关资源
最近更新 更多