[英]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;
但是,当我尝试使用此COUNT
来UPDATE
列时,我却惨败,因为它只对表中的所有行进行计数并将其保存为每个行值,因此在每个行值中出现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.