SQL逻辑 - 涉及带有Group By子句的Update语句的逻辑

时间:2018-05-09 06:25:44

标签: sql group-by logic

很长一段时间后尝试SQL。 需要您帮助解决此任务。 我创建了一个过程,用于根据其他列组合将列的值从第1行更新为N. 目前,其他列已填充且计算列为空

前:

Account Category    Metric  Count   Calculated Cloumn 5
A          1         ABC     45             
A          1         DEF     25             
A          1         XYZ                    
B          5         ABC     29             
B          5         DEF        

在上表中,计算列5是使用前4个字段组合计算的焦点字段,

前:

if Account=a ,Category=1 and metric -abc,def,xyz then 
    sum(count) Group by Account and Category

不同组合的不同逻辑。

现在我正在使用以下程序脚本:

SET @variable1 = (select sum(count)
    from table1
    where [Category]  = '1'
    and [ACCOUNT] = 'A'
    and [Metric Name] =  'ABC' );

SET @variable2 = 'select sum(count)
    from table1
    where [Category]  = '1'
    and [ACCOUNT] = 'B'
    and [Metric Name] =  'DEF' ';


update [dbo].[table1]
    set calculated field = (
    (case when 
        @variable1 > '0'
    then 
        @variable1
    else
        @variable2
    end)

此脚本的问题在于,输出值将跨所有行复制,而不仅仅是针对该组合。 基本上我需要使用分组AccountCategory列来计算字段,以便仅针对该组合反映输出值。

2 个答案:

答案 0 :(得分:0)

试试这个:

UPDATE [dbo].[table1]
    SET calculated field = (
    (CASE WHEN 
        @variable1 > '0'
    THEN 
        @variable1
    ELSE
        @variable2
    END)
WHERE [Category]  = '1'
    AND [ACCOUNT] = 'A'
    AND [Metric Name] =  'ABC'

答案 1 :(得分:0)

我假设SQL Server基于语法。

我认为变量不是正确的方法。有关您提供的信息:

with toupdate as (
      select t.*,
             sum(count) over (partition by Account, Category) as sum_1
      from t
     )
update toupdate
    set calculated_field = sum_1
    where Account = 'A' and Category = 1 and metric in ('abc', 'def', 'xyz);