查询中的SQL Server错误

时间:2017-01-18 14:54:07

标签: mysql sql-server sql-server-2008 datetime

我正在尝试协作3个查询来执行算术运算。查询显示在

(SELECT ITEM_ID,ISNULL(SUM(REC_GOOD_QTY),0)
FROM INVENTORY_ITEM
WHERE COMPANY_ID = 1
AND INVENTORY_ITEM.COMPANY_BRANCH_ID = 1
AND INVENTORY_ITEM.INV_ITEM_STATUS = 'Inward'
AND GRN_DATE <  CAST('2017-01-10 00:00:00.0' AS DATETIME)
GROUP BY INVENTORY_ITEM.ITEM_ID) - 
(SELECT ITEM_ID, SUM ( TOTAL_LITRE )
FROM STOCK_REQUISITION_ITEM B, STOCK_REQUISITION A 
WHERE A.ID = B.REQUISITION_ID
AND A.COMPANY_ID = 1
AND A.REQ_FROM_BRANCH_ID = 1 
AND A.REQUISITION_DATE < CAST('2017-01-10 00:00:00.0' AS DATETIME)
GROUP BY B.ITEM_ID) + 
(SELECT ITEM_ID, SUM ( RETURN_QUANTITY )
FROM STOCK_RETURN_ITEM B, STOCK_RETURN A 
WHERE A.ID = B.STOCK_RETURN_ID
AND A.COMPANY_ID = 1
AND A.COMPANY_BRANCH_ID = 1 
AND A.RETURN_DATE <= CAST('2017-01-10 00:00:00.0' AS DATETIME)
GROUP BY B.ITEM_ID)

我收到此错误。

  

[Err] 42000 - [SQL Server]&#39;附近的语法不正确 - &#39;。
  42000 - [SQL Server]&#39; +&#39;

附近的语法不正确

2 个答案:

答案 0 :(得分:0)

在查询中,您始终返回两个字段ITEM_ID和一个数字字段。

要应用算术运算,您必须返回一个数字字段

第一个查询:

SELECT ITEM_ID,ISNULL(SUM(REC_GOOD_QTY),0)

变为

SELECT ISNULL(SUM(REC_GOOD_QTY),0)

第二个问题:

SELECT ITEM_ID, SUM ( TOTAL_LITRE )

变为

SELECT SUM ( TOTAL_LITRE )

第三个问题:

SELECT ITEM_ID, SUM ( RETURN_QUANTITY )

变为

SELECT SUM ( RETURN_QUANTITY )

因此GROUP BY每个查询返回多行

<强>更新

我尝试重写您的查询:

SELECT DISTINCT ii.item_id, 
ISNULL(
    (SELECT SUM(ii2.rec_good_qty)
    FROM inventory_item ii2
    WHERE ii2.item_id = ii.item_id
    AND ii.company_id = 1
    AND ii.company_branch_id = 1
    AND ii.inv_item_status = 'Inward'
    AND ii.grn_date <  CAST('2017-01-10 00:00:00.0' AS DATETIME))
    ,0) -
ISNULL(
    (SELECT SUM(total_litre)
    FROM stock_requisition_item b
    JOIN stock_requisition a
        ON a.id = b.requisition_id
    WHERE a.company_id = 1
    AND a.req_from_branch_id = 1 
    AND a.requisition_date < CAST('2017-01-10 00:00:00.0' AS DATETIME))
,0) +
ISNULL(
    (SELECT SUM(return_quantity)
    FROM stock_return_item b
    JOIN stock_return a
        ON a.id = b.stock_return_id
    WHERE a.company_id = 1
    AND a.company_branch_id = 1
    AND a.return_date <= CAST('2017-01-10 00:00:00.0' AS DATETIME))
,0) AS result
FROM inventory_item ii
WHERE ii.company_id = 1
AND ii.company_branch_id = 1
AND ii.inv_item_status = 'Inward'
AND ii.grn_date <  CAST('2017-01-10 00:00:00.0' AS DATETIME)

答案 1 :(得分:0)

在此处了解详情并不多。我们实际上并不确定你是使用mysql还是sql server但是很确定你使用的是sql server。我认为你可以通过这些方式实现你想要做的事情。

with Iventory as
(
    SELECT i.ITEM_ID
        , GoodQty = ISNULL(SUM(i.REC_GOOD_QTY), 0)
    FROM INVENTORY_ITEM i
    WHERE COMPANY_ID = 1
        AND i.COMPANY_BRANCH_ID = 1
        AND i.INV_ITEM_STATUS = 'Inward'
        AND i.GRN_DATE <  '2017-01-10'
    GROUP BY i.ITEM_ID
) 
, StockRequisition as
(
    SELECT ITEM_ID
        , TotalLitre = SUM(TOTAL_LITRE)
    FROM STOCK_REQUISITION_ITEM B
    JOIN STOCK_REQUISITION A ON A.ID = B.REQUISITION_ID
    WHERE A.COMPANY_ID = 1
        AND A.REQ_FROM_BRANCH_ID = 1 
        AND A.REQUISITION_DATE < '2017-01-10'
    GROUP BY B.ITEM_ID
) 
StockReturn as
(
    SELECT ITEM_ID
        , ReturnQuantity = SUM(RETURN_QUANTITY)
    FROM STOCK_RETURN_ITEM B
    JOIN STOCK_RETURN A ON A.ID = B.STOCK_RETURN_ID
    WHERE A.COMPANY_ID = 1
        AND A.COMPANY_BRANCH_ID = 1 
        AND A.RETURN_DATE <= '2017-01-10'
    GROUP BY B.ITEM_ID
)

select i.ITEM_ID
    , MyCalculation = i.GoodQty - isnull(Req.TotalLitre, 0) + isnull(sr.ReturnQuantity, 0)
from Inventory i
left join StockRequisition sr on sr.ITEM_ID = i.ITEM_ID
left join StockReturn Req on Req.ITEM_ID = i.ITEM_ID