2015-05-12 167 views
-1

我的代码在L42(from子句)上返回语法错误。我看了看,对我来说,语法看起来正确的为FROMSQL Server 2008:FROM子句语法错误

代码的顶部创建临时表'子产品'。然后我想从数据库表中提取数据&从新的临时表中提取相关详细信息。

任何想法?

drop table ##subproducts; 

SELECT 
    F1.[OrderNo] 
    ,F1.[OrderSeqNo] 
    ,F1.[OrderLineNo] 
    ,sum(F1.[LineCost]) as LineCost 
    ,sum(F1.[NetCost]) as NetCost 
    ,sum(F1.[OrderNet]) as OrderNet 
INTO 
    ##subproducts 
FROM 
    [UFPData].[dbo].[SalesStats] F1 
WHERE 
    F1.MainProd = 'S' 
GROUP BY 
    F1.OrderNo, F1.OrderSeqNo, F1.OrderLineNo; 

SELECT * 
FROM SalesStats F1 
LEFT OUTER JOIN ##subproducts F2 ON F1.OrderNo = F2.OrderNo 
           AND F1.OrderSeqNo = F2.Orderseqno 
           AND F1.OrderLineNo = F2.OrderLineNo 
WHERE YEAR(InvDate) = 2015 
    AND MONTH(InvDate) = 5 
    AND CustNo = 100382 
    AND MainProd = 'Y'; 

SELECT 
    ContractInfo.CONTRNO, 
    ContractInfo.CONTRDESC, 
    repcode, 
    RepName, 
    PriceAgreement, 
    ordercycle, 
    SalesStats.CustNo, 
    Customer.CustName, 
    SalesStats.InvDate, 
    SalesStats.InvoiceNo, 
    salesstats.ProdCode, 
    Price as ContractPrice, 
    subproduct.LineCost as LineCost, 
    subproduct.NetCost as NetCost, 
    subproduct.OrderNet as OrderNet, 
    contractinfo.NETCOST as BidPrice, 
    contractinfo.NETCOST* SUM(quantity) as BidCost, 
FROM 
    UFPData.dbo.SalesStats 
RIGHT OUTER JOIN 
    ##subproducts ON UFPData.dbo.SalesStats.ProdCode = ##subproducts.ProdCode, 
    UFPData.dbo.SalesStats 
LEFT OUTER JOIN 
    UFPData.dbo.Customer ON UFPData.dbo.SalesStats.CustNo = UFPData.dbo.Customer.CustNo, UFPData.dbo.SalesStats 
LEFT OUTER JOIN 
    Pricing.dbo.InvManCen ON UFPData.dbo.SalesStats.ProdCode = Pricing.dbo.invmancen.UFPCODE, UFPData.dbo.SalesStats 
RIGHT OUTER JOIN 
    UFPData.dbo.ContractInfo ON UFPData.dbo.Customer.CustNo = UFPData.dbo.ContractInfo.CUSTNO 
          AND UFPData.dbo.salesstats.prodcode = UFPData.dbo.contractinfo.prodcode, 
WHERE 
    invdate BETWEEN '2015-05-01' and '2015-05-31' 
    AND TeamCode IN ('tm1','tm2','tm3') 
    AND ContractInfo.CONTRNO IN ('1500','1502','1503','1504','1505','1506','701','702','703','705','141', 
'712', '713', '714', '715', '716', '717', '718', '719', '730', '731', '732') or CONTRNO between '3000' and '3049') 
--and left(ordercycle,1) <> 'c' 
GROUP BY 
    ContractInfo.CONTRNO, 
    repcode, 
    RepName, 
    SalesStats.CustNo, 
    Customer.CustName, 
    SalesStats.InvDate, 
    salesstats.ProdCode, 
    Price, 
    contractinfo.NETCOST, 
    SalesStats.InvoiceNo, 
    InvManCen.PS98, 
    ContractInfo.CONTRDESC, 
    ordercycle, 
    PriceAgreement, 

case 
when invdate > ('20' + LEFT(ENDDATE,2)+ '-'+ SUBSTRING(cast(ENDDATE as varchar(6)),3,2)+ '-'+ SUBSTRING(cast(ENDDATE as varchar(6)),5,2)) then 'Expired' else 'Live' end; 

提前感谢

+0

如果##副产品不存在呢? –

+7

是的,您在'FROM'之前有一个额外的',':BidCost,FROM' – Lamak

回答

1

这不正确的看向我:

FROM 
UFPData.dbo.SalesStats right outer join ##subproducts on UFPData.dbo.SalesStats.ProdCode = ##subproducts.ProdCode, 
UFPData.dbo.SalesStats left outer join UFPData.dbo.Customer on UFPData.dbo.SalesStats.CustNo = UFPData.dbo.Customer.CustNo, 
UFPData.dbo.SalesStats left outer join Pricing.dbo.InvManCen on UFPData.dbo.SalesStats.ProdCode = Pricing.dbo.invmancen.UFPCODE, 
UFPData.dbo.SalesStats right outer join UFPData.dbo.ContractInfo on UFPData.dbo.Customer.CustNo = UFPData.dbo.ContractInfo.CUSTNO and UFPData.dbo.salesstats.prodcode = UFPData.dbo.contractinfo.prodcode, 

通常格式是这样的:

FROM 
    TableName 
    INNER JOIN SomeOtherTable... 
    INNER JOIN AnotherTable... 

注意,第一表提到一次,不是每次加入之前。在每次连接之后,您似乎也会错误地使用逗号,这在语法上不正确。我想你想要的是:

FROM 
UFPData.dbo.SalesStats 
right outer join ##subproducts on UFPData.dbo.SalesStats.ProdCode = ##subproducts.ProdCode 
left outer join UFPData.dbo.Customer on UFPData.dbo.SalesStats.CustNo = UFPData.dbo.Customer.CustNo 
left outer join Pricing.dbo.InvManCen on UFPData.dbo.SalesStats.ProdCode = Pricing.dbo.invmancen.UFPCODE 
right outer join UFPData.dbo.ContractInfo on UFPData.dbo.Customer.CustNo = UFPData.dbo.ContractInfo.CUSTNO and UFPData.dbo.salesstats.prodcode = UFPData.dbo.contractinfo.prodcode 

在整个查询中可能会有更多的语法错误。我建议将代码格式化得更干净一些,以便更容易地找到它们。例如,对比上面是这样的:

FROM 
    UFPData.dbo.SalesStats 
    RIGHT OUTER JOIN ##subproducts 
     ON UFPData.dbo.SalesStats.ProdCode = ##subproducts.ProdCode 
    LEFT OUTER JOIN UFPData.dbo.Customer 
     ON UFPData.dbo.SalesStats.CustNo = UFPData.dbo.Customer.CustNo 
    LEFT OUTER JOIN Pricing.dbo.InvManCen 
     ON UFPData.dbo.SalesStats.ProdCode = Pricing.dbo.invmancen.UFPCODE 
    RIGHT OUTER JOIN UFPData.dbo.ContractInfo 
     ON UFPData.dbo.Customer.CustNo = UFPData.dbo.ContractInfo.CUSTNO 
     AND UFPData.dbo.salesstats.prodcode = UFPData.dbo.contractinfo.prodcode 

这是一个小的变化,往往个人喜好的问题,但良好的格式化代码带来了许多优势。较少的水平滚动使得查看相关代码变得更加容易,特定关键字和子句的换行符使得更容易发现错误的逗号等。

0

下面是我认为应该是有效的语法提供,请尝试它并将其与原来的比较,因为有多个错误:

DROP TABLE ##subproducts; 

SELECT F1.[OrderNo] , 
     F1.[OrderSeqNo] , 
     F1.[OrderLineNo] , 
     SUM(F1.[LineCost]) AS LineCost , 
     SUM(F1.[NetCost]) AS NetCost , 
     SUM(F1.[OrderNet]) AS OrderNet 
INTO ##subproducts 
FROM [UFPData].[dbo].[SalesStats] F1 
WHERE F1.MainProd = 'S' 
GROUP BY F1.OrderNo , 
     F1.OrderSeqNo , 
     F1.OrderLineNo; 

SELECT * 
FROM SalesStats F1 
     LEFT OUTER JOIN ##subproducts F2 ON F1.OrderNo = F2.OrderNo 
              AND F1.OrderSeqNo = F2.Orderseqno 
              AND F1.OrderLineNo = F2.OrderLineNo 
WHERE YEAR(InvDate) = 2015 
     AND MONTH(InvDate) = 5 
     AND CustNo = 100382 
     AND MainProd = 'Y'; 

SELECT ContractInfo.CONTRNO , 
     ContractInfo.CONTRDESC , 
     repcode , 
     RepName , 
     PriceAgreement , 
     ordercycle , 
     SalesStats.CustNo , 
     Customer.CustName , 
     SalesStats.InvDate , 
     SalesStats.InvoiceNo , 
     SalesStats.ProdCode , 
     Price AS ContractPrice , 
     subproduct.LineCost AS LineCost , 
     subproduct.NetCost AS NetCost , 
     subproduct.OrderNet AS OrderNet , 
     ContractInfo.NetCost AS BidPrice , 
     ContractInfo.NetCost * SUM(quantity) AS BidCost 
FROM UFPData.dbo.SalesStats 
     RIGHT OUTER JOIN ##subproducts ON UFPData.dbo.SalesStats.ProdCode = ##subproducts.ProdCode 
     LEFT OUTER JOIN UFPData.dbo.Customer ON UFPData.dbo.SalesStats.CustNo = UFPData.dbo.Customer.CustNo 
     LEFT OUTER JOIN Pricing.dbo.InvManCen ON UFPData.dbo.SalesStats.ProdCode = Pricing.dbo.invmancen.UFPCODE 
     RIGHT OUTER JOIN UFPData.dbo.ContractInfo ON UFPData.dbo.Customer.CustNo = UFPData.dbo.ContractInfo.CUSTNO 
                AND UFPData.dbo.salesstats.prodcode = UFPData.dbo.contractinfo.prodcode 
WHERE invdate BETWEEN '2015-05-01' AND '2015-05-31' 
     AND TeamCode IN ('tm1', 'tm2', 'tm3') 
     AND (ContractInfo.CONTRNO IN ('1500', '1502', '1503', '1504', '1505', 
             '1506', '701', '702', '703', '705', 
             '141', '712', '713', '714', '715', '716', 
             '717', '718', '719', '730', '731', '732') 
     OR CONTRNO BETWEEN '3000' AND '3049') 
GROUP BY ContractInfo.CONTRNO , 
     repcode , 
     RepName , 
     SalesStats.CustNo , 
     Customer.CustName , 
     SalesStats.InvDate , 
     SalesStats.ProdCode , 
     Price , 
     ContractInfo.NetCost , 
     SalesStats.InvoiceNo , 
     InvManCen.PS98 , 
     ContractInfo.CONTRDESC , 
     ordercycle , 
     PriceAgreement , 
     CASE WHEN invdate > ('20' + LEFT(ENDDATE, 2) + '-' 
           + SUBSTRING(CAST(ENDDATE AS VARCHAR(6)), 3, 2) 
           + '-' + SUBSTRING(CAST(ENDDATE AS VARCHAR(6)), 5, 
               2)) THEN 'Expired' 
      ELSE 'Live' 
     END; 
+0

是的,我很新。这部分代码是我从之前完成这项工作的人那里拿来的,还有一些代码是我被要求放在一起的。这些内容大部分都在我的头上。我认为它运行的问题是,在FROM语句之前的行结尾(我认为是42)。当我使用AdventureWorks DB和我的SQL书的时候,我已经明白了。 – IainW

+0

@IainW你现在有没有工作,或者你有进一步的疑问? – Tanner