【问题标题】:Using WITH and subset in CASE construction在 CASE 构造中使用 WITH 和子集
【发布时间】:2020-09-04 07:54:09
【问题描述】:

向资深同事问好。我被这件事缠住了。 构造时需要根据load_date字段的状态替换CASE中的对应值。 问题是第二个被分配了一个值到 mean_v 字段基于对子样本获得的平均 mean_v 的计算。 那么何时实现价值获取与赋值呢? 我试图创建别名,别名()作为(),但sql在WITH附近抛出语法错误。 我必须从子集中分配一个平均值,其中列对应于每行的当前行 什么问题?我可以在 CASE 中使用 WITH 吗?

UPDATE public.table 
set mean_v =
            CASE 
                WHEN table.load_date IS NOT NULL 
                    THEN 
                    DATEDIFF(day, CONVERT(date, table.load_date),CONVERT(date, table.req_date))

                WHEN table.load_date IS NULL 
                    THEN
                    --(select id, customer, code, mean_v from public.data) as t
                    
                    --wish use this to set for load_date per row:
                    --select AVG(t.mean_v) from t, public.table 
                    --where t.customer = table.customer
                    --and t.code = table.code
                    
             END```

【问题讨论】:

  • 回答你最后一个问题:不,你不能在case 表达式中使用with。也就是说,很可能存在替代解决方案。请提供一些示例数据和预期输出。
  • 样本数据和期望的结果真的很有帮助。

标签: sql sql-server sql-update subquery


【解决方案1】:

可能是这样的

UPDATE t
set mean_v =
            CASE 
                WHEN load_date IS NOT NULL 
                    THEN 
                    DATEDIFF(day, CONVERT(date, load_date),CONVERT(date, req_date))
                WHEN load_date IS NULL 
                    THEN (
                        SELECT AVG(tt.mean_v)
                        FROM public.table tt
                        WHERE t.customer = tt.customer
                        and t.code = tt.code
                    )
             END
FROM public.table t

【讨论】:

  • 当使用来自 public.table t 的 UPDATE t 时,我在第一个 FROM... (SQL SERVER) 附近有语法错误
  • 我的错,FROM 必须在SET 之后。在我的代码示例中修复了它。
  • 是的,我以后明白了。谢谢!这是作品!而且看起来很聪明
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-25
  • 2021-01-16
  • 2021-12-18
  • 1970-01-01
相关资源
最近更新 更多