当前位置: 首页 > 面试题库 >

具有CASE,GROUP BY和HAVING的SQL UPDATE

焦正德
2023-03-14
问题内容

下面的SELECT语句返回正确的数据

SELECT stu.sc, stu.sn, COUNT(*) AS Total,
    CASE
      WHEN COUNT(*) = 3 Then 'Letter 1'
      WHEN COUNT(*) = 4 Then 'Letter 2'
      WHEN COUNT(*) = 5 Then 'Letter 3'
      ELSE 'SARB'
    END AS Letter  
FROM STU  join att ON (stu.SC = att.SC and stu.SN = att.SN)
WHERE att.al in ('c','t','u')
GROUP by stu.sc, stu.sn
HAVING COUNT(*) >= 3

我需要基于该查询执行UPDATE,但似乎无法弄清楚。我已经看了多个在线示例,这些示例与我所需要的相似,但是我无法使它正常工作。我需要能够做这样的事情…

UPDATE stu
SET stu.tru = 
   CASE
     When COUNT(*) = 3 Then 'Letter 1'
     When COUNT(*) = 4 Then 'Letter 2'
     When COUNT(*) = 5 Then 'Letter 3'
     ELSE 'SARB'
   END  
FROM stu  JOIN att
   on (stu.sc = att.sc and stu.sn = att.sn)
WHERE ATT.AL in ('c','t','u')
GROUP BY stu.sc, stu.sn
HAVING COUNT(*) >= 3

我知道我不能在Update语句中直接使用Group By and Haveing,但是我看到了一些示例,在这些示例中,他们在Set and
Join之前使用Select with Group By。我就是无法正常工作。

谢谢你的帮助。


问题答案:
WITH CTE AS (
  SELECT stu.sc, stu.sn, COUNT(*) AS Total,
      CASE
        WHEN COUNT(*) = 3 Then 'Letter 1'
        WHEN COUNT(*) = 4 Then 'Letter 2'
        WHEN COUNT(*) = 5 Then 'Letter 3'
        ELSE 'SARB'
      END AS Letter  
  FROM STU  join att ON (stu.SC = att.SC and stu.SN = att.SN)
  WHERE att.al in ('c','t','u')
  GROUP by stu.sc, stu.sn
  HAVING COUNT(*) >= 3
)
UPDATE stu
SET stu.tru = cte.Letter
FROM stu  JOIN cte
   on (stu.sc = cte.sc and stu.sn = cte.sn)


 类似资料:
  • 我有一堆数据帧,我连接成一个大数据帧。所有行都有一个datetime、一个名称,然后是一些具有随机值的列,例如,数据帧可以如下所示: 现在,我需要按对这些行进行分组,并将它们分成60分钟的bins,我目前的做法如下: 这可以用任何方式来完成吗?或者我必须将我的数据帧一分为二,然后在之后加入?

  • 问题内容: select SUM (Bill) from ProductSaleReport group by PCI having MONTH(Date) between 1 and 3 有人可以帮我发现问题吗? 我得到了错误: 消息8121,级别16,状态1,行1 列“ ProductSaleReport.Date”在HAVING子句中无效,因为它既不包含在聚合函数中也不在GROUP BY子句

  • 我有以下代码块可以正常工作; 这给了我2个错误; 错误%1“System.Collections.ObjectModel.ObservableCollection.ObservableCollection(System.Collections.Generic.List)”的最佳重载方法匹配包含一些无效参数 错误2参数1:无法从“System.Linq.IQueryable>”转换为“System.

  • 我试图通过下面的SQL语句删除一些记录,但得到错误附近使用的正确语法: 有没有人知道我怎么解决错误? 我还尝试了下面的句子,在那里我得到了这个错误)附近使用的正确语法: 上面的句子在表中查找nobody ecxept本身未使用的行,该表将表链接到主表。 为了上述问题,我尝试上面的但我得到以下错误中指定目标表“TA_”以进行更新: 最后尝试了双重包装,但也不起作用,这是错误附近使用的正确语法:

  • 问题内容: 有没有一种方法可以使用IN子句进行CASE语句? 问题答案: 是的。您需要使用表达式的“搜索”形式而不是“简单”形式

  • 问题内容: 是什么区别,并在声明中? 编辑:我已将史蒂文的答案标记为正确的答案,因为它包含链接上信息的关键部分: 不使用when时,其行为类似于子句 我所见过的情况并没有发生,而这正是我开始困惑的地方。当然,除非您知道这一点,否则无法在问题中指定它。 问题答案: HAVING为SELECT语句中使用的组或聚合函数指定搜索条件。