2013-02-28 97 views
0

我试图从Access到SQL SERVER 2008转换报表查询。使用相同的数据库,但我无法得到相同的结果。差远了。 Access查询是这样的:从访问查询转换为SQL Server

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语法无关的错误? 感谢提前的帮助。并为我长长的脚本感到抱歉。

回答

0

您的SQL服务器查询缺少MS Access查询的WHERE和HAVING子句,它的GROUP BY子句没有与MS Access查询相同的列号或顺序,并且具有额外的JOIN条件, t在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] [起始日期]和[表格] [MenuReports] [结束日期]值。

+0

感谢您的答案,它真的帮了我。 – 2013-03-04 01:11:19