【问题标题】:Cannot figure out how to update column in a table depending on a group of column/s in same table无法弄清楚如何根据同一表中的一组列更新表中的列
【发布时间】:2014-02-27 01:02:51
【问题描述】:

我正在尝试将列 total(Totl) 更新为 SUM(Volume) 除以 COUNT(*) ,仅针对列/s 组(周)中的行,在 4 个不同的表中水果(Fruit_Volume)和很多记录(具有更多属性,如买家、种植区域......),我只想为 Apples(Item_Name)生成有机(Fruit_Type)的值,按周(日期)分组。 -TIA

UPDATE Fruit_Volume
SET Totl = B.Totl
FROM (SELECT SUM(Volume)/COUNT(*) Totl FROM Fruit_Volume
    WHERE Item_Name LIKE 'Apple%' AND Fruit_Type = 'Organic'
    GROUP BY Week -- I feel the need to group by Item_Group, Fruit_Type
     ) as B
WHERE Item_Name LIKE 'Apple%' AND Fruit_Type = 'Organic'

【问题讨论】:

  • 当您按周分组时,您的子查询将返回多行,因此您无法更新。如果它返回一个值,我相信它会起作用
  • 具有预期输出的示例架构和数据会很有用
  • @aaryan 不要使用无法更新 Totl 字段的分组依据(它会给出多个结果)。为什么需要按周分组?

标签: sql-server tsql cursor sql-update common-table-expression


【解决方案1】:

我在这里假设您要记录同一周、同一产品的多行共有的总数,然后将其应用于受该周影响的水果。

UPDATE fv
SET fv.Totl = B.Totl
FROM 
    Fruit_Volume fv
    INNER JOIN
    (
        SELECT 
          SUM(Volume) / COUNT(*) Totl,
          [Week]
        FROM
          Fruit_Volume
        WHERE 
          Item_Name LIKE 'Apple%' AND Fruit_Type = 'Organic'
        GROUP BY 
          [Week]
     ) as B
     ON fv.[Week] = b.[Week]
WHERE 
    Item_Name LIKE 'Apple%' AND Fruit_Type = 'Organic';

SqlFiddle here

编辑 查询可以通过CTE 更新一点DRY'd

WITH cte AS 
(
  SELECT 
    *
  FROM
    Fruit_Volume
  WHERE 
    Item_Name LIKE 'Apple%' AND Fruit_Type = 'Organic'

)
UPDATE cte
    SET cte.Totl = B.Totl
    FROM 
        cte
        INNER JOIN
        (
            SELECT 
              SUM(Volume) / COUNT(*) Totl,
              [Week]
            FROM
              cte
            GROUP BY 
              [Week]
         ) as B
         ON cte.[Week] = b.[Week];

Updated fiddle

【讨论】:

  • 谢谢。你是对的,我试图为所有水果和单个水果保持多个表的共同点。
猜你喜欢
  • 2016-07-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-22
  • 2016-02-26
  • 2021-08-31
  • 2020-11-16
  • 2023-02-22
相关资源
最近更新 更多