【发布时间】:2014-02-20 09:02:11
【问题描述】:
我需要一些有关此 SQL 存储过程的帮助。我正在使用来自不同表的源填充中间表 (COM_EXISTENCIAS) 以用于报告目的。在第一步中,我用 COM_INVENTARIOS 表中符合某些要求的数据填充它,如果有超过一行与 cryteria 匹配,则分组以汇总库存:
BEGIN
INSERT INTO COM_EXISTENCIAS
(
Mes ,
Anyo ,
Centro ,
Codigo ,
Stock ,
Descripcion
)
SELECT I.Mes ,
I.Anyo ,
I.Centro ,
I.Codigo ,
SUM(I.Stock) AS STOCK ,
I.Descripcion
FROM COM_INVENTARIOS I
WHERE I.Mes = @Mes
AND I.Centro = @Emp
AND I.NumInv = @NumInv
AND I.Anyo = @Anyo
GROUP BY I.Codigo ,
I.Mes ,
I.Anyo ,
I.Centro ,
I.Descripcion
END
在第二步中,我继续使用另一个表中的数据填充该表(仅限第一个查询未插入的产品,或者表中不存在的产品)
INSERT INTO COM_EXISTENCIAS
(
Mes ,
Anyo ,
Centro ,
Stock ,
Codigo
)
SELECT @Mes ,
@Anyo ,
@Emp ,
0 ,
Cod_art
FROM COM_ENTRADAS
WHERE MONTH(Fecha) = @Mes
AND Emp = @Emp
AND YEAR(Fecha) = @Anyo
EXCEPT
SELECT @Mes ,
@Anyo ,
@Emp ,
0 ,
Codigo
FROM COM_INVENTARIOS
WHERE Mes = @Mes
AND Centro = @Emp
AND Anyo = @Anyo
EXCEPT
SELECT @Mes ,
@Anyo ,
@Emp ,
0 ,
Codigo
FROM COM_EXISTENCIAS
WHERE Mes = @Mes
AND Centro = @Emp
AND Anyo = @Anyo
只要我只需要运行一次,它就可以完美运行。我的问题是有时我需要重新运行存储过程,因为一些新产品已添加到 COM_INVENTARIOS。我发现如果在第二步中已经从 COM_ENTRADAS 插入了一行并且现在存在于 COM_INVENTARIOS 中,它不会更新当前行,而是插入一个新行,所以我以两行具有相同数据的行结束。如果表上已经存在 Mes、Centro、NumInv 和 Anyo,我应该如何修改查询的第一部分以进行更新而不是添加?
还有一个额外的问题:在创建线条之后,我会在第三步中使用 COM_ENTRADAS 中的数据进行附加查询来更新它们。它现在可以工作了,但也许有一些更“干净”的方式来查询数据库,或者将两个查询合二为一?
UPDATE dbo.COM_EXISTENCIAS
SET TotEntradas = T.TotEnt ,
ImporteCompras = T.Importe
FROM ( SELECT Cod_art ,
ISNULL(ROUND(SUM(Cantidad), 3), 0) AS TotEnt ,
ISNULL(ROUND(SUM(( P_coste ) * ( Cantidad )), 2), 0) AS Importe
FROM COM_ENTRADAS
WHERE Emp = @Emp
AND MONTH(Fecha) = CAST(@Mes AS INT)
AND YEAR(Fecha) = CAST(@Anyo AS INT)
GROUP BY Cod_art
) AS T
WHERE T.Cod_art = dbo.COM_EXISTENCIAS.Codigo
AND Mes = @Mes
AND Anyo = @Anyo
AND Centro = @Emp
【问题讨论】:
-
您可以根据
MERGE子句的条件UPDATE或INSERT:msdn.microsoft.com/en-us/library/bb510625.aspx -
忘了说是SQL 2005,所以很遗憾不能使用MERGE。
标签: sql-server tsql sql-server-2005