复杂查询出现问题“无法绑定多部分标识符”

时间:2019-12-12 10:05:32

标签: sql sql-server join ssms

我无法在SQL上创建此视图。作为查询,它运行良好,但是当尝试将其另存为视图时,出现“无法绑定多部分标识符”错误。我认为这与隐式联接有关。

在下面的脚本(case语句)中将带有额外选项卡的零件插入时,会发生此问题。 有没有办法重写它以将其另存为视图?

谢谢

WITH MNP AS 
(SELECT        
    GoodsReceivedID AS ID, 
    PORef, 
    MIN(IncomingDate) AS Manip_Start_Date,
    SUM(CASE WHEN ArticleType = 'TEX' THEN UNITS ELSE 0 END) AS TEX_Mnp, 
    SUM(CASE WHEN ArticleType = 'ACC' THEN UNITS ELSE 0 END) AS ACC_Mnp, 
    SUM(CASE WHEN ArticleType = 'SHOE' THEN UNITS ELSE 0 END) AS SHOE_Mnp, 
    SUM(CASE WHEN ArticleType = 'TARA' THEN UNITS ELSE 0 END) AS TARA_Mnp, 
    SUM(CASE WHEN ArticleType NOT IN ('TEX','ACC','SHOE','TARA') THEN UNITS ELSE 0 END) AS MIX_Mnp,
    SUM(UNITS) AS Total_Units
 FROM dbo.NT_ManipulationResult 
 GROUP BY PORef, GoodsReceivedID),
INV AS 
(SELECT 
    GoodsReceivedID, 
    SUM(CASE WHEN UNITOFSUPPLYID = 1 THEN IN_TOTAL_UNITS END) AS Invoice_Units,
    SUM (CASE WHEN UNITOFSUPPLYID = 2 THEN IN_TOTAL_UNITS END) AS Invoice_KG,
    SUM (InvoiceNet + InvoiceVAT) AS Invoice_TOT
 FROM [dbo].[NT_GoodsReceivedInvoice]
 GROUP BY GoodsReceivedID
)


SELECT
    GR.ID, 
    GR.VL_Ref,
    GR.DateReceived, 
    MNP.Manip_Start_Date,
    COALESCE(DATEDIFF (Day, DateReceived, MNP.Manip_Start_Date),'') AS DaysToManipulate,
    WR.Name AS Warehouse, 
    GR.ArticleOriginID AS Origin, 
    SP.Name AS Supplier, 
    GD.Name AS Grade,
    COALESCE(INV.Invoice_TOT,0) AS Invoice_TOT,
    COALESCE(INV.Invoice_Units,0) AS Invoice_Units,
    COALESCE(INV.Invoice_KG,0) AS Invoice_KG,
    COALESCE(MNP.Total_Units,0) AS ManipulatedUnits, 
    CASE WHEN COALESCE(MNP.Total_Units,0) <> 0 THEN COALESCE(MNP.Total_Units,0) - COALESCE(INV.Invoice_Units,0) ELSE 0 END AS Manip_Difference,
    COALESCE(MNP.TEX_Mnp,0) AS TEX_Mnp,
    COALESCE(MNP.ACC_Mnp,0) AS  ACC_Mnp,
    COALESCE(MNP.SHOE_Mnp,0) AS SHOE_Mnp,
    COALESCE(MNP.TARA_Mnp,0) AS TARA_Mnp,
    COALESCE(MNP.MIX_Mnp,0) AS MIX_Mnp,



        CASE WHEN COALESCE(MNP.Total_Units,0) <> 0 THEN (COALESCE(INV.Invoice_TOT,0) / (COALESCE(MNP.TEX_Mnp,0) + 0.35*COALESCE(MNP.ACC_Mnp,0) + 1.2*COALESCE(MNP.SHOE_Mnp,0) + .45*COALESCE(MNP.TARA_Mnp,0) +.8*COALESCE(MNP.MIX_Mnp,0))) ELSE 0 END AS TEX_Cost,
        CASE WHEN COALESCE(MNP.Total_Units,0) <> 0 THEN 0.35*(COALESCE(INV.Invoice_TOT,0) / (COALESCE(MNP.TEX_Mnp,0) + 0.35*COALESCE(MNP.ACC_Mnp,0) + 1.2*COALESCE(MNP.SHOE_Mnp,0) + .45*COALESCE(MNP.TARA_Mnp,0) +.8*COALESCE(MNP.MIX_Mnp,0))) ELSE 0 END AS ACC_Cost,
        CASE WHEN COALESCE(MNP.Total_Units,0) <> 0 THEN 1.2*(COALESCE(INV.Invoice_TOT,0) / (COALESCE(MNP.TEX_Mnp,0) + 0.35*COALESCE(MNP.ACC_Mnp,0) + 1.2*COALESCE(MNP.SHOE_Mnp,0) + .45*COALESCE(MNP.TARA_Mnp,0) +.8*COALESCE(MNP.MIX_Mnp,0))) ELSE 0 END AS SHOE_Cost,
        CASE WHEN COALESCE(MNP.Total_Units,0) <> 0 THEN 0.45*(COALESCE(INV.Invoice_TOT,0) / (COALESCE(MNP.TEX_Mnp,0) + 0.35*COALESCE(MNP.ACC_Mnp,0) + 1.2*COALESCE(MNP.SHOE_Mnp,0) + .45*COALESCE(MNP.TARA_Mnp,0) +.8*COALESCE(MNP.MIX_Mnp,0))) ELSE 0 END AS TARA_Cost,
        CASE WHEN COALESCE(MNP.Total_Units,0) <> 0 THEN 0.8*(COALESCE(INV.Invoice_TOT,0) / (COALESCE(MNP.TEX_Mnp,0) + 0.35*COALESCE(MNP.ACC_Mnp,0) + 1.2*COALESCE(MNP.SHOE_Mnp,0) + .45*COALESCE(MNP.TARA_Mnp,0) +.8*COALESCE(MNP.MIX_Mnp,0))) ELSE 0 END AS MIX_Cost



FROM dbo.NT_GoodsReceived AS GR 
LEFT OUTER JOIN MNP ON GR.ID = MNP.ID 
LEFT OUTER JOIN [dbo].[NT_Warehouse] WR ON GR.WarehouseID = WR.ID
LEFT OUTER JOIN [dbo].[NT_ArticleOrigin] AO ON GR.ArticleOriginID = AO.ID
LEFT OUTER JOIN [dbo].[NT_Supplier] SP ON GR.SupplierID = SP.ID
LEFT OUTER JOIN [dbo].[NT_ArticleGrade] GD ON GR.ArticleGradeID = GD.ID 
LEFT OUTER JOIN INV ON GR.ID = INV.GoodsReceivedID
WHERE GR.ID NOT IN (19,20)

1 个答案:

答案 0 :(得分:0)

我找到了解决方法:

我没有在查询中添加MNP和INV作为WITH语句,而是将它们创建为单独的视图,并在此新查询中引用了这些视图,现在可以将其另存为视图。

脚本结束如下:

SELECT
    GR.ID, 
    GR.VL_Ref, 
    GR.DateReceived, 
    MNP.Manip_Start_Date, 
    COALESCE (DATEDIFF (Day, GR.DateReceived, MNP.Manip_Start_Date),'') AS DaysToManipulate, 
    WR.Name AS Warehouse, 
    GR.ArticleOriginID AS Origin, 
    SP.Name AS Supplier, 
    GD.Name AS Grade,   
    COALESCE(INV.Invoice_TOT,0) AS Invoice_TOT,
    COALESCE(INV.Invoice_Units,0) AS Invoice_Units,
    COALESCE(INV.Invoice_KG,0) AS Invoice_KG,
    COALESCE(MNP.Total_Units,0) AS ManipulatedUnits,    
    CASE WHEN MNP.Total_Units IS NOT NULL THEN MNP.Total_Units - INV.Invoice_Units ELSE 0 END AS Manip_Difference,
    COALESCE(MNP.TEX_Mnp,0) AS TEX_Mnp, 
    COALESCE(MNP.ACC_Mnp,0) AS  ACC_Mnp,
    COALESCE(MNP.SHOE_Mnp,0) AS SHOE_Mnp,
    COALESCE(MNP.TARA_Mnp,0) AS TARA_Mnp,
    COALESCE(MNP.MIX_Mnp,0) AS MIX_Mnp, 
    CASE WHEN MNP.Total_Units IS NOT NULL THEN (COALESCE(INV.Invoice_TOT,0) / (COALESCE(MNP.TEX_Mnp,0) + 0.35*COALESCE(MNP.ACC_Mnp,0) + 1.2*COALESCE(MNP.SHOE_Mnp,0) + .45*COALESCE(MNP.TARA_Mnp,0) +.8*COALESCE(MNP.MIX_Mnp,0))) ELSE 0 END AS TEX_Cost,
    CASE WHEN MNP.Total_Units IS NOT NULL THEN 0.35*(COALESCE(INV.Invoice_TOT,0) / (COALESCE(MNP.TEX_Mnp,0) + 0.35*COALESCE(MNP.ACC_Mnp,0) + 1.2*COALESCE(MNP.SHOE_Mnp,0) + .45*COALESCE(MNP.TARA_Mnp,0) +.8*COALESCE(MNP.MIX_Mnp,0))) ELSE 0 END AS ACC_Cost,
    CASE WHEN MNP.Total_Units IS NOT NULL THEN 1.2*(COALESCE(INV.Invoice_TOT,0) / (COALESCE(MNP.TEX_Mnp,0) + 0.35*COALESCE(MNP.ACC_Mnp,0) + 1.2*COALESCE(MNP.SHOE_Mnp,0) + .45*COALESCE(MNP.TARA_Mnp,0) +.8*COALESCE(MNP.MIX_Mnp,0))) ELSE 0 END AS SHOE_Cost,
    CASE WHEN MNP.Total_Units IS NOT NULL THEN 0.45*(COALESCE(INV.Invoice_TOT,0) / (COALESCE(MNP.TEX_Mnp,0) + 0.35*COALESCE(MNP.ACC_Mnp,0) + 1.2*COALESCE(MNP.SHOE_Mnp,0) + .45*COALESCE(MNP.TARA_Mnp,0) +.8*COALESCE(MNP.MIX_Mnp,0))) ELSE 0 END AS TARA_Cost,
    CASE WHEN MNP.Total_Units IS NOT NULL THEN 0.8*(COALESCE(INV.Invoice_TOT,0) / (COALESCE(MNP.TEX_Mnp,0) + 0.35*COALESCE(MNP.ACC_Mnp,0) + 1.2*COALESCE(MNP.SHOE_Mnp,0) + .45*COALESCE(MNP.TARA_Mnp,0) +.8*COALESCE(MNP.MIX_Mnp,0))) ELSE 0 END AS MIX_Cost
FROM dbo.NT_GoodsReceived AS GR 
LEFT OUTER JOIN MNP ON GR.ID = MNP.ID 
LEFT OUTER JOIN dbo.NT_Warehouse AS WR ON GR.WarehouseID = WR.ID 
LEFT OUTER JOIN dbo.NT_ArticleOrigin AS AO ON GR.ArticleOriginID = AO.ID 
LEFT OUTER JOIN dbo.NT_Supplier AS SP ON GR.SupplierID = SP.ID 
LEFT OUTER JOIN dbo.NT_ArticleGrade AS GD ON GR.ArticleGradeID = GD.ID 
LEFT OUTER JOIN INV  ON GR.ID = INV.GoodsReceivedID
WHERE (GR.ID NOT IN (19, 20))