【问题标题】:How to get column value without using in GROUP BY clause如何在不使用 GROUP BY 子句的情况下获取列值
【发布时间】:2018-10-12 10:35:25
【问题描述】:

我想用从 VHSTATUS 表中检索到的最新时间更新 VHMAIN 表。我写了如下查询

select a.vehi_id,a.statustime,a.vhstatus,max(b.statustime) 
newstatustime,b.vhstatus newstatus
from vhmain a inner join vhstatus b on a.vehi_id=b.vehi_id2 
group by a.vehi_id,a.statustime,a.vhstatus having 
a.statustime<>max(b.statustime)

我遇到了错误

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

如果我在 GROUP BY 子句中添加“vhstatus.vhstatus”,整个数据将是错误的

请建议我查询

编辑:表格和预期结果数据

VHMAIN
vehi_id   statustime  vhstatus
38        2004-03-08      9

VHSTATUS
vehi_id2  statustime  vhstatus
38        2004-03-11  55  
38        2004-03-08  55  
38        2004-03-08  9

Expected result
vehi_id   statustime  vhstatus    newstatustime newstatus
38        2004-03-08  9            2004-03-11     55

【问题讨论】:

  • 请添加相关表格的结构。一些样本数据也不会受到伤害。
  • 更新语句在哪里?
  • @FindOutIslamNow 我猜 George 正在尝试首先选择正确的值,以确保更新实际上会更新预期的记录。
  • @LajosArpad:使用表格的示例结构进行编辑。
  • 我已经根据您的结构添加了一个答案,但请注意它未经测试。

标签: select sql-server-2012 group-by aggregate-functions


【解决方案1】:

好的。你试过嵌套查询吗?

例如:

select tbl.*, department.Name
from department 
  inner join (
     select departmentId, COUNT(*) cnt
     from employees
     group by departmentId 
) AS tbl on tbl.departmentId = department.Id

【讨论】:

  • 谢谢哥们。我有个主意
【解决方案2】:

你可以这样做:

update VHMAIN
set VHMAIN.vhstatus = VHSTATUS.vhstatus
from VHMAIN
inner join VHSTATUS
on VHMAIN.vehi_id = VHSTATUS.vehi_id2
where VHSTATUS.statustime = (select top 1 vhs.statustime
                             from VHSTATUS.statustime vhs
                             where vhs.vehi_id2 = VHSTATUS.vehi_id2
                             order by vhs.statustime desc);

上面未经测试的代码将 select 来自 VHSTATUS 的具有最新 statustime 的项目,并将其与外部命令中的 statustime 进行检查,以便您准确找到您正在搜索的项目,然后是 @987654326 @VHMAIN 到它的vhstatus

【讨论】:

    【解决方案3】:
    select  tbl.*,x.vhstatus from vhstatus x inner join (select 
    a.vehi_id,a.statustime,a.vhstatus,max(b.statustime) newstatustime from vhmain a
    inner join vhstatus b on a.vehi_id=b.vehi_id2 group by 
    a.vehi_id,a.statustime,a.vhstatus  having max(a.statustime) 
    <>max(b.statustime)) tbl on tbl.newstatustime=x.statustime and 
    tbl.vehi_id=x.vehi_id2  order by tbl.vehi_id
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-08-12
      • 1970-01-01
      • 1970-01-01
      • 2012-05-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-26
      相关资源
      最近更新 更多