2017-01-18 2 views
-1

Я пытаюсь объединить 3 запроса для выполнения арифметической операции. Запросы показаны вОшибки сервера Sql в запросе

(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] Неверный синтаксис рядом с '-'.
42000 - [SQL Server] Неправильный синтаксис около '+'

+2

Этот запрос является беспорядочным с точки зрения форматирования. Сделайте себе одолжение и ознакомьтесь с пробелом. Вы также должны использовать разумные псевдонимы таблицы. Псевдоним не очень полезен, если вам нужно снова и снова ссылаться на основную часть запроса, чтобы увидеть, из какой таблицы появляется A.SomeColumn. Тогда вы не согласны с их использованием. Иногда вы делаете, а другие - нет. И последнее, но не менее важное - это устаревший синтаксис соединения. Присоединение к стилю ANSI-92 существует уже более 25 лет. http://sqlblog.com/blogs/aaron_bertrand/archive/2009/10/08/bad-habits-to-kick-using-old-style-joins.aspx –

+0

Существует таблица, в которой у вас есть список ITEM_ID, не повторяющийся ? В таблице Inventory_item имеется более одной строки для одного и того же идентификатора ITEM_ID, не так ли? –

+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) 
+0

Благодарим вас за ответ sir. Можете ли вы переписать запрос для меня? –

+0

Сэр, но ITEM_ID также хочет напечатать в моем результате, как это сделать с этими запросами –

0

Не так много, чтобы идти дальше здесь для подробностей. И мы на самом деле не уверены, что вы используете mysql или sql-сервер, но достаточно уверены, что используете sql-сервер. Я думаю, вы можете выполнить то, что вы пытаетесь сделать с чем-то в этом направлении.

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 
Смежные вопросы