从Access Query转换为SQL Server

时间:2013-02-28 02:33:49

标签: sql-server ms-access

我正在尝试将报表查询从Access转换为SQL SERVER 2008.使用相同的数据库但我无法获得相同的结果。差远了。 Access查询是这样的:

SELECT Sum(INPUT_ItemSaleLines.TaxExclusiveTotal) AS TotalexTax,([TotalexTax])- Sum(    Nz([SumOfTaxExclusiveAmount])+ Nz([CostOfGoodsSoldAmount])+ Nz  
    (   
            Nz
            (   IIf
                (   Left([Input_Items.ItemNumber],5)='31-63',136*[Quantity]/1000,
                    IIf(Left([Input_Items.ItemNumber],6)='34S-63',200*[Quantity]/1000)
                )
            )+ Nz
            (   IIf
                (   Left([Input_Items.ItemNumber],5)='34-63',250*[Quantity]/1000,
                    IIf(Left([Input_Items.ItemNumber],6)='26-63',250*[Quantity]/1000)
                )
            )
        )
    ) AS Margin,    
    INPUT_Cards_1.Name AS SalesPerson, INPUT_Sales.SalesPersonID, 
    INPUT_Sales.InvoiceStatusID, INPUT_Cards.Name, INPUT_Items.ItemName, 
    Sum(INPUT_ItemSaleLines.Quantity) AS TotalQty, 
    Sum(INPUT_ItemSaleLines.CostOfGoodsSoldAmount) AS TotalCOGS, 
    Count(INPUT_Sales.SaleID) AS [Number of Sales], 
    Sum(qryShippingTotalexGST.SumOfTaxExclusiveAmount) AS ShippingTotal

FROM 
    (   qryShippingTotalexGST RIGHT JOIN 
        (
            (
                (   
                    INPUT_Items INNER JOIN INPUT_ItemSaleLines 
                    ON INPUT_Items.ItemID = INPUT_ItemSaleLines.ItemID
                ) INNER JOIN INPUT_Sales ON INPUT_ItemSaleLines.SaleID = INPUT_Sales.SaleID
            ) INNER JOIN INPUT_Cards ON INPUT_Sales.CardRecordID = INPUT_Cards.CardRecordID
        ) ON qryShippingTotalexGST.JobID = INPUT_ItemSaleLines.JobID
    ) LEFT JOIN INPUT_Cards AS INPUT_Cards_1 ON INPUT_Sales.SalesPersonID = INPUT_Cards_1.CardRecordID
WHERE 
    (((INPUT_Sales.Date) Between [Forms]![MenuReports]![StartDate] And [Forms]![MenuReports]![EndDate]))
GROUP BY INPUT_Items.ItemNumber,    
    INPUT_Cards_1.Name, INPUT_Sales.SalesPersonID, INPUT_Sales.InvoiceStatusID, 
    INPUT_Cards.Name, INPUT_Items.ItemName
HAVING 
    (((INPUT_Sales.InvoiceStatusID)<>"OR"));

然后我写的SQL Server脚本如下:

SELECT MYOBItems.ItemName, MYOBCards.Name AS SalesPerson, MYOBCards1.Name, 
    SUM(MYOBsalesLines.Qty) AS TotalQty, 
    SUM(MYOBsalesLines.CostOfGoodsSoldAmount) AS TotalCOGS, 
    COUNT(MYOBSales.SaleID) AS NumberOfSales, 
    SUM(MYOBsalesLines.TaxExclusiveAmount) AS TotalexTax,
    SUM(cast(MYOBJobsShippingTotals.TaxExclusiveAmount AS Decimal(18,2))) AS ShippingTotal,
    (SUM(MYOBsalesLines.TaxExclusiveAmount)) - SUM
    (
        COALESCE(cast(MYOBJobsShippingTotals.TaxExclusiveAmount AS Decimal(18,2)),0)+ COALESCE(MYOBsalesLines.CostOfGoodsSoldAmount,0)+ COALESCE
        (
            COALESCE
            (   
                CASE 
                    WHEN LEFT(MYOBItems.ItemNumber,5) = '31-63' THEN (136*MYOBsalesLines.Qty/1000)
                    WHEN LEFT(MYOBItems.ItemNumber,6) = '34S-63' THEN (200*MYOBsalesLines.Qty/1000) 
                    ELSE 0
                END, 0                          
            )+ COALESCE
            (   
                CASE 
                    WHEN LEFT(MYOBItems.ItemNumber,5) = '34-63' THEN (250*MYOBsalesLines.Qty/1000)
                    WHEN LEFT(MYOBItems.ItemNumber,6) = '26-63' THEN (250*MYOBsalesLines.Qty/1000)  
                    ELSE 0  
                END , 0     
            ), 0
        )
    )AS Margin      
    , MYOBSales.InvoiceStatusID FROM 
    (   MYOBJobsShippingTotals RIGHT JOIN 
        (
            (
                (   
                    MYOBItems INNER JOIN MYOBsalesLines 
                    ON MYOBItems.ItemID = MYOBsalesLines.ItemID                     
                ) INNER JOIN MYOBSales ON MYOBsalesLines.SaleID = MYOBSales.SaleID
                    AND MYOBSales.ElevateCompanyID = MYOBsalesLines.ElevateCompanyID
            ) INNER JOIN MYOBCards AS MYOBCards1 ON MYOBSales.CardRecordID = MYOBCards1.CardRecordID
                AND MYOBsalesLines.ElevateCompanyID = MYOBCards1.ElevateCompanyID 
            AND MYOBSales.ElevateCompanyID = MYOBCards1.ElevateCompanyID
        ) ON MYOBJobsShippingTotals.JobID = MYOBsalesLines.JobID
    ) LEFT JOIN MYOBCards ON MYOBSales.SalesPersonID = MYOBCards.CardRecordID 
GROUP BY MYOBItems.ItemName, MYOBCards.Name,
    MYOBCards1.Name, MYOBSales.InvoiceStatusID

我怀疑连接表有问题但不确定如何修复它。 我的SQL Server脚本中是否有任何与Access语法无关的错误? 提前感谢您的帮助。抱歉我的长脚本。

1 个答案:

答案 0 :(得分:0)

您的SQL Server查询缺少MS Access查询的WHERE和HAVING子句,它的GROUP BY子句与MS Access查询没有相同的列数或顺序,并且还有其他加入MS Access查询中没有的条件。

更忠实的转换看起来像这样:

SELECT SUM(MYOBsalesLines.TaxExclusiveAmount) AS TotalexTax
     , SUM(MYOBsalesLines.TaxExclusiveAmount)
       - SUM
         (
           COALESCE(cast(MYOBJobsShippingTotals.TaxExclusiveAmount AS Decimal(18,2)), 0)
           + COALESCE(MYOBsalesLines.CostOfGoodsSoldAmount,0)
           + COALESCE
             (
               COALESCE
               (   
                 CASE 
                   WHEN LEFT(MYOBItems.ItemNumber,5) = '31-63' THEN (136*MYOBsalesLines.Qty/1000)
                   WHEN LEFT(MYOBItems.ItemNumber,6) = '34S-63' THEN (200*MYOBsalesLines.Qty/1000) 
                   ELSE 0
                 END
                 , 0                          
               )
               + COALESCE
                 (   
                   CASE 
                     WHEN LEFT(MYOBItems.ItemNumber,5) = '34-63' THEN (250*MYOBsalesLines.Qty/1000)
                     WHEN LEFT(MYOBItems.ItemNumber,6) = '26-63' THEN (250*MYOBsalesLines.Qty/1000)  
                     ELSE 0  
                   END
                   , 0     
                 )
               , 0
             )
         )
       AS Margin
     , MYOBCards1.Name AS SalesPerson
     , MYOBSales.SalesPersonID
     , MYOBSales.InvoiceStatusID
     , MYOBCards.Name
     , MYOBItems.ItemName
     , SUM(MYOBsalesLines.Qty) AS TotalQty
     , SUM(MYOBsalesLines.CostOfGoodsSoldAmount) AS TotalCOGS
     , COUNT(MYOBSales.SaleID) AS NumberOfSales
     , SUM(cast(MYOBJobsShippingTotals.TaxExclusiveAmount AS Decimal(18,2))) AS ShippingTotal   
FROM 
(
    MYOBJobsShippingTotals RIGHT JOIN 
    (
        (
            (   
                MYOBItems INNER JOIN MYOBsalesLines 
                ON MYOBItems.ItemID = MYOBsalesLines.ItemID                     
            ) INNER JOIN MYOBSales ON MYOBsalesLines.SaleID = MYOBSales.SaleID
        ) INNER JOIN MYOBCards ON MYOBSales.CardRecordID = MYOBCards.CardRecordID
    ) ON MYOBJobsShippingTotals.JobID = MYOBsalesLines.JobID
) LEFT JOIN MYOBCards AS MYOBCards1 ON MYOBSales.SalesPersonID = MYOBCards1.CardRecordID
WHERE MYOBSales.Date BETWEEN ? AND ?
GROUP BY MYOBItems.ItemNumber
       , MYOBCards1.Name
       , MYOBSales.SalesPersonID
       , MYOBSales.InvoiceStatusID
       , MYOBCards.Name
       , MYOBItems.ItemName
HAVING MYOBSales.InvoiceStatusID <> 'OR'

两个问号是你的[表格]![MenuReports]![StartDate]和[Forms]![MenuReports]![EndDate]值。