如何阻止此查询汇总所有行而不只是一行?

时间:2016-08-04 03:06:32

标签: sql-server tsql

此存储过程具有来自两个不同表的3个函数。

  1. 如果表B中的行确实存在qty字段。

  2. 如果表B中不存在该行,请从表A中插入。

  3. 最后将表A和表B中的数量相加,并使用新的求和值更新表B数量字段。

  4. 我唯一的问题是存储过程对表B中的每一行求和,而不是正确的行或插入的新行。可以用一些方向来解决? 提前谢谢。

    PROCEDURE [dbo].[XXXXXXXXXXXX]
        @VendorAccountID int,
        @pocomment text,
        @sqlident int output
    AS
    BEGIN
        SET NOCOUNT ON;
        DECLARE @Rowcount INT;  --newly declared, not assigned. NULL   
    
        INSERT INTO InventoryMaster_tbl(InvManufacture, InvModel, 
                InvManPartNumber, InvDescription, InvLastPO, InvLastVendor)
            SELECT TOP 1 
                PartOrderManufacture, PartOrderModel, PartManufPartNum,
                PartOrderDesc, POID, VendorAccountID
            FROM
                PurchaseOrderTmp_tbl
            WHERE 
                NOT EXISTS (SELECT 1
                            FROM InventoryMaster_tbl
                            WHERE InvManPartNumber = PartManufPartNum)
    
        SET @Rowcount = @@ROWCOUNT
    
        INSERT INTO [PurchaseOrder_tbl] ([POVendorID], [pocomment])
        VALUES (@VendorAccountID, @pocomment)
    
        SET @sqlident = SCOPE_IDENTITY()
    
        UPDATE [PurchaseOrderTmp_tbl]
        SET POID = @sqlident
    
        UPDATE [PurchaseOrder_tbl]
        SET POTicketNumber = [PartOrderTicketID]
        FROM PurchaseOrderTmp_tbl
        WHERE PurchaseOrder_tbl.POID = @sqlident
    
        INSERT INTO PurchaseOrderItems_tbl(POID, VendorAccountID, POTicketID, 
                            POInvItemID, POLineItemQty, PartManufPartNum, PartOrderDesc, 
                            PartOrderManufacture, PartOrderModel, POType, PODescription,
                            POStatusID, PartRequestedBy, POGLCode)
            SELECT
                POID, VendorAccountID, PartOrderTicketID, PartInvID, 
                POItemQty, PartManufPartNum, PartOrderDesc, PartOrderManufacture,
                PartOrderModel, POType, PODescription, POStatusID, PartRequestedBy, POGLCode
            FROM
                PurchaseOrderTmp_tbl
    
        UPDATE [InventoryMaster_tbl]
        SET InvTotalQtyOnOrder = InvTotalQtyOnOrder + POLineItemQty 
        FROM InventoryMaster_tbl
        INNER JOIN PurchaseOrderItems_tbl PartManufPartNum ON PartManufPartNum = InvManPartNumber
        WHERE InvManPartNumber = PartManufPartNum
    
        DELETE PurchaseOrderTmp_tbl
    END
    

    这是我要感谢大家输入的最终结果:USE

    GO
    /****** Object:  StoredProcedure [dbo].[TestPurchaseOrderCreateNew]    Script Date: 8/4/2016 6:15:02 AM ******/
    SET ANSI_NULLS ON
    GO
    SET QUOTED_IDENTIFIER ON
    GO
    -- =============================================
    -- Author:      <Author,,Name>
    -- Create date: <Create Date,,>
    -- Description: <Description,,>
    -- =============================================
    ALTER PROCEDURE [dbo].[XXXXXXXXXXX]
        -- Add the parameters for the stored procedure here
        @VendorAccountID int,
        @pocomment text,
        @sqlident int output
    
    AS
    BEGIN
        -- SET NOCOUNT ON added to prevent extra result sets from
        -- interfering with SELECT statements.
        SET NOCOUNT ON;
          --newly declared, not assigned. NULL   
    
    
    INSERT INTO InventoryMaster_tbl
        (InvManufacture,InvModel,InvManPartNumber,InvDescription,InvLastPO,InvLastVendor)
    Select TOP 1 PartOrderManufacture,PartOrderModel,PartManufPartNum,PartOrderDesc,POID, VendorAccountID
    From PurchaseOrderTmp_tbl
    WHERE NOT EXISTS (Select 1
    FROM InventoryMaster_tbl
    WHERE InvManPartNumber = PartManufPartNum
    )
    
    INSERT INTO [PurchaseOrder_tbl] 
        ([POVendorID],[pocomment])
    Values (@VendorAccountID,@pocomment)
    SET @sqlident = SCOPE_IDENTITY()
    
    UPDATE [PurchaseOrderTmp_tbl]
    
    SET POID = @sqlident
    
    UPDATE [PurchaseOrder_tbl]
    Set POTicketNumber = [PartOrderTicketID]
    From PurchaseOrderTmp_tbl
    Where PurchaseOrder_tbl.POID = @sqlident
    
    INSERT INTO PurchaseOrderItems_tbl
         (POID,VendorAccountID,POTicketID,POInvItemID,POLineItemQty,PartManufPartNum,PartOrderDesc,PartOrderManufacture,PartOrderModel,POType,PODescription,POStatusID,PartRequestedBy,POGLCode)
    Select POID, VendorAccountID, PartOrderTicketID, PartInvID, POItemQty,PartManufPartNum,PartOrderDesc,PartOrderManufacture,PartOrderModel,POType,PODescription,POStatusID,PartRequestedBy,POGLCode
    From PurchaseOrderTmp_tbl
    
    UPDATE [InventoryMaster_tbl]
        SET InvTotalQtyOnOrder += 
        (SELECT SUM(POItemQty) FROM PurchaseOrderTmp_tbl WHERE InvManPartNumber = PartManufPartNum)
    FROM InventoryMaster_tbl
    WHERE InvManPartNumber IN (SELECT PartManufPartNum FROM PurchaseOrderTmp_tbl)
    
    Delete PurchaseOrderTmp_tbl
    
    END
    

1 个答案:

答案 0 :(得分:-1)

为什么不将SET语句更改为InvTotalQtyOnOrder + = 1,如果您只想增加计数?

此外,WHERE子句是多余的,因为您的INNER JOIN使用相同的列标准,因此您已经限制为该数据子集。

编辑:在讨论问题后,我想我对你想要的结果有了更好的了解。尝试使用此更新语句而不是第3次更新时使用的更新语句,看看它是否符合您的要求

UPDATE [InventoryMaster_tbl]
    SET InvTotalQtyOnOrder += (SELECT SUM(POLineItemQty) FROM PurchaseOrderItems_tbl WHERE InvManPartNumber = PartManufPartNum)
FROM InventoryMaster_tbl

编辑2:将WHERE子句添加到UPDATE以仅更新采购订单临时表中包含制造部件号的记录,以便仅更新新的采购订单。

UPDATE [InventoryMaster_tbl]
    SET InvTotalQtyOnOrder += 
    (SELECT SUM(POLineItemQty) FROM PurchaseOrderItems_tbl WHERE InvManPartNumber = PartManufPartNum)
FROM InventoryMaster_tbl
WHERE InvManPartNumber IN (SELECT PartManufPartNum FROM PurchaseOrderTmp_tbl)