【问题标题】:Subquery where I can count number of times a name appears from the first query子查询,我可以计算名称从第一个查询中出现的次数
【发布时间】:2016-05-12 09:23:17
【问题描述】:

这是我当前的代码:

select Name, ECU, Identifier, Value, Max(Filetime) as "Filetime"
from dbo.view_1
where ECU='EBS7' and Identifier='88' and Value='2459579' or identifier ='87' and Value='2431629'
group by Name, ECU, Identifier, Value
ORDER BY
    MAX(Name) ASC 

这是我得到的结果:

我想要某种子查询或计算名称出现次数的东西。我们可以看到 Agon 出现了两次,而 Apollo Akka 只出现了一次。

关于我应该写什么的任何提示?

【问题讨论】:

  • 您使用的是 MySQL 还是 MS SQL Server? (不要标记未涉及的产品...)您的 AND/OR 用法可能需要一些括号?

标签: sql sql-server subquery


【解决方案1】:

我不知道 MySQL(您实际使用的是哪个产品?),但在 MS-SQL 中

ORDER BY MAX(Name) ASC

甚至不会编译。您不能按不在 SELECT 列表中的列进行排序。

如果你想得到你的原始结果集,名字的频率在集合本身中,并且你正在使用 MS-SQL,你可以使用 CTE:

WITH theset AS 
(select Name, ECU, Identifier, Value, Max(Filetime) as "Filetime"
from dbo.view_1
where ECU='EBS7' and Identifier='88' and Value='2459579' or identifier ='87' and Value='2431629'
group by Name, ECU, Identifier, Value)

SELECT set.*,CountNames.NameCount
FROM
    theset set
INNER JOIN
    (SELECT Name,Count(*) AS NameCount FROM theset GROUP BY Name) CountNames
ON set.Name=CountNames.Name

【讨论】:

  • 我使用的是 ms sql 2014 版本。 Order BY max(name) asc实际上有效。因为我有一个 group by 我需要有某种聚合函数来使用 order by。这样,列表按名称排序。谢谢,我会试试你的代码!
  • ORDER BY Max(Name) 可以“工作”,因为它可以编译,但它没有意义。当 Name 已经在 GROUP BY 子句中时,对于集合的每个成员,Name 将始终 = MAX(Name)。 ORDER BY Max(Name) 等价于 ORDER BY (Name),而且很混乱,所以我建议把它去掉。现在让我看看 CTE 代码是否有效
  • 编译错误Select set.*, CountNames.NameCountON set.Name=CountNames.Name 它说。语法不正确。
  • 可能我将 CTE 别名为“set”,忘记了这是 SQL 保留字。将其别名为其他名称,应该可以解决它。
  • 谢谢,成功了!如果我只想显示 NameCount 为 2 或更大的所有车辆,我应该怎么做?某种having 声明?
【解决方案2】:

您可以为此使用相关子查询:

Select Name, ECU, Identifier, Value,
       Max(Filetime) as "Filetime",
       (select count(*)
       from dbo.view_1 t2 
       where t2.Name = t1.Name and
             ECU ='EBS7' and 
             ((Identifier='88' and Value='2459579') or 
             (identifier ='87' and Value='2431629')) as cnt
from dbo.view_1 t1
where ECU ='EBS7' and 
      ((Identifier='88' and Value='2459579') or 
      (identifier ='87' and Value='2431629'))
group by Name, ECU, Identifier, Value
ORDER BY MAX(Name) ASC 

【讨论】:

  • 谢谢,但是 cnt 显示错误的值。 Agon 名称 Agon 出现了 2 次,但 cnt 显示它出现了 561 次。对于 Aisa,cnt 是 564。
  • @AdnanHossain 我忘了在子查询的WHERE 子句中包含其他谓词。请检查我所做的修改。
  • 还是不行。根据cnt,Agon出现了39次,其余的继续。
  • @AdnanHossain 在这种情况下,您的谓词有问题。您应该考虑在WHERE 子句中添加括号。检查我所做的编辑,看看是否有帮助。
  • 编辑有帮助,它适用于许多车辆。但这是一个小错误。有些车辆即使只列出一次,也会显示为 cnt = 2。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-02-24
  • 2021-02-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多