Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL逻辑-包含Group By子句的Update语句的逻辑_Sql_Group By_Logic - Fatal编程技术网

SQL逻辑-包含Group By子句的Update语句的逻辑

SQL逻辑-包含Group By子句的Update语句的逻辑,sql,group-by,logic,Sql,Group By,Logic,在很长一段时间后尝试SQL。 需要你帮忙解决这个任务。 我创建了一个过程,用于根据其他列组合将列的值从第1行更新到第N行。 当前,填充了其他列,计算列为空 例: 在上表中,计算列5是要使用前4个字段的组合计算的焦点字段 例: 不同的组合有不同的逻辑 现在我使用以下程序脚本: SET @variable1 = (select sum(count) from table1 where [Category] = '1' and [ACCOUNT] = 'A' and

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

例:

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

例:

不同的组合有不同的逻辑

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

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)
这个脚本的问题是,输出值是跨所有行复制的,而不仅仅是针对该组合。 基本上,我需要在计算字段中使用Group by
Account
Category
列,以便输出值仅反映该组合。

尝试以下操作:

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'

我假设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);

什么是RDBMS?也许?显然不理解您的问题,但variable1值是您的第一条记录,它意味着45,variable2值是0,因为他们没有这样的记录,它将更新45到所有记录,因为他们没有条件。那么你能正确地回答吗explain@KavalPatel你的理解部分正确。实际需要的是,只有在Account和Category分别为A和1的前两行中才有值45。对于其余行,它仍应标记为null。请参阅文章的最后一段,即需要使用帐户和类别字段编写组。
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'
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);