繁体   English   中英

使用SQL Server另一列中的行值计数更新列

[英]Update column with count of row value in another column in SQL Server

我不知道为什么我还没有找到一个解决这个放在这里,但是:我想COUNT了多少次Serial_Parent在包装阶段出现这样我就可以在其他计算中使用。

这完美地工作:

SELECT 
    Serial_Parent, COUNT(Serial_Parent)
FROM 
    mfng_data
WHERE 
    Machine_Process = 'Packing'
GROUP BY 
    Serial_Parent;

但是,当我尝试使用此COUNTUPDATE列时,我却惨败,因为它只对表中的所有行进行计数并将其保存为每个行值,因此在每个行值中出现2,134,222。

我已经试过了:

UPDATE mfng_data
SET Count_Serial_Parent = (SELECT COUNT(*)
                           FROM mfng_data 
                           WHERE Machine_Process = 'Packing'
                             AND Serial_Parent = Serial_Parent) 
WHERE Serial_Parent = Serial_Parent;

我也尝试过这个:

UPDATE mfng_data
SET Count_Serial_Parent = (SELECT COUNT(Serial_Parent)
                           FROM mfng_data 
                           WHERE Machine_Process = 'Packing'
                             AND Serial_Parent = Serial_Parent);

样本数据:

Spec: 12373  Rev: -6    M35846  M358461 M3584610    M35846101   NULL    NULL    NULL    M35846101   6808
Spec: 12373  Rev: -6    M35846  M358461 M3584610    M35846102   NULL    NULL    NULL    M35846102   6808
Spec: 16692  Rev: -4    K45678  K456781 K4567810    K45678101   NULL    NULL    NULL    K45678101   3964
Spec: 16692  Rev: -4    K45678  K456782 K4567820    K45678201   NULL    NULL    NULL    K45678201   3978
Spec: 16693  Rev: -4    K45678  K456782 K4567820    K45678202   NULL    NULL    NULL    K45678202   3806

所需的结果(M35846将出现两次,因此每行条目将列出“ 2”)

Serial_Parent Count_Serial_Parent
----------------------------------
M35846           2
M35846           2
J39384          52 - - > 52 rows will show "52" and so on below
M35488          10
K4448            4
M35927           8
K45678           3

您需要表别名和合格的列名:

UPDATE m
    SET Count_Serial_Parent = (SELECT COUNT(*)
                               FROM mfng_data m2
                               WHERE m2.Machine_Process = 'Packing' AND
                                     m2.Serial_Parent = m.Serial_Parent 
                              )
    FROM mfng_data m;

子查询需要与外部查询相关 诸如Serial_Parent = Serial_Parent类的条件基本上总是评估为true,因为它引用的是子查询中引用的表的列。

但是,更好的方法是更新CTE:

with toupdate as (
      select m.*,
             sum(case when m.Machine_Process = 'Packing' then 1 else 0 end) over (partition by m.serial_parent) as new_Count_Serial_Parent 
      from  mfng_data m
     )
update toupdate
    set Count_Serial_Parent = new_Count_Serial_Parent;

另一种方法(使用玩具桌-希望您能想到这个主意):

DECLARE @ TABLE (Serial_Parent int, Count_Serial_Parent int)
INSERT INTO @ (Serial_Parent, Count_Serial_Parent) VALUES
(1,0), (1,0),(2,0),(2,0),(2,0)
SELECT * FROM @

UPDATE m -- mfng_data

SET m.Count_Serial_Parent = j.Count_Serial_Parent
FROM @ m -- mfng_data
JOIN (
SELECT Serial_Parent, COUNT(*) Count_Serial_Parent
FROM @ 
GROUP BY Serial_Parent
) j ON j.Serial_Parent = m.Serial_Parent

SELECT * FROM @

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM