2015-03-17 6 views
0

Я пытаюсь использовать несколько подзапросов, но я получаю сообщение об ошибке. Он работает, если я удаляю второй подзапрос.Использование нескольких подзапросов в заявлении sql

Ошибка:

Msg 512, Level 16, State 1, Line 2 Subquery returned more than 1 value. This is not permitted when the subquery follows =, !=, <, <= , >, >= or when the subquery is used as an expression.

USE SUPERSTARIS 
    SELECT lines.Item, 
     Inventory.ItemAlternative, 
     Inventory.OnHandPhys, 
     Inventory.Allocated, 
     Inventory.CostPrice, 
     replace(vInventoryOptional2Values.Value, '/', '') AS Brand, 
     Inventory.Optional3 AS StockStatus, 
     (SELECT SUM(l.Invoiced) * -1 
      FROM lines l 
      WHERE l.Date >= '2014-01-01' 
       AND l.Date <= '2014-01-31' 
       AND l.Item = lines.Item) AS QtySoldInPeriod, 
     (SELECT SUM(lines.AmountBase-lines.CostAmount)*-1 
      FROM lines l 
      WHERE l.Date >= '2014-01-01' 
       AND l.Date <= '2014-01-31' 
       AND l.Item = lines.Item) AS QtySoldInPeriod2 
    FROM lines 
    INNER JOIN inventory ON lines.item = Inventory.item 
    INNER JOIN vInventoryOptional2Values ON Inventory.Optional2 = vInventoryOptional2Values.RecordID 
    WHERE lines.Invoiced < 0 
     AND Inventory.Status = 0 
     AND Inventory.Optional3 <> 3 
    GROUP BY Lines.Item, 
     Inventory.Optional3, 
     Inventory.ItemAlternative, 
     Inventory.OnHandPhys, 
     Inventory.CostPrice, 
     vInventoryOptional2Values.Value, 
     Inventory.Allocated 
+1

Ну его точно, что ошибка говорит ... просто читать ... – Nightmaresux

+1

Issue является здесь 'SUM (lines.AmountBase-lines.CostAmount)' (ваш второй подзапрос) использует псевдоним как 'SUM (l.AmountBase-l.CostAmount)' –

+0

Подзапрос с 'sum()' и no 'group by' должен всегда возвращать одну строку. Вы уверены, что это точный запрос, который дает ошибку «возврат более одного значения»? – Andomar

ответ

0

Как Coder кодекса писал, ошибка вы ссылаетесь основной таблицы запроса в подзапрос вместо таблицы подзапроса. Поэтому вы можете быстро исправить свою ошибку. Но вы уже группируете line.item в основном запросе, поэтому вам не нужны дополнительные подзапросы для получения SUM.

можно упростить запрос - удалить подзапросов:

USE SUPERSTARIS 
SELECT lines.Item, 
    Inventory.ItemAlternative, 
    Inventory.OnHandPhys, 
    Inventory.Allocated, 
    Inventory.CostPrice, 
    replace(vInventoryOptional2Values.Value, '/', '') AS Brand, 
    Inventory.Optional3 AS StockStatus, 
    -SUM(lines.Invoiced) AS QtySoldInPeriod, 
    -SUM(lines.AmountBase-lines.CostAmount) AS QtySoldInPeriod2 
FROM lines 
INNER JOIN inventory ON lines.item = Inventory.item 
INNER JOIN vInventoryOptional2Values ON Inventory.Optional2 = vInventoryOptional2Values.RecordID 
WHERE lines.Invoiced < 0 
    AND lines.Date >= '2014-01-01' 
    AND lines.Date <= '2014-01-31' 
    AND Inventory.Status = 0 
    AND Inventory.Optional3 <> 3 
GROUP BY Lines.Item, 
    Inventory.Optional3, 
    Inventory.ItemAlternative, 
    Inventory.OnHandPhys, 
    Inventory.CostPrice, 
    vInventoryOptional2Values.Value, 
    Inventory.Allocated 

и делать дальнейшие оптимизации:

USE SUPERSTARIS 
SELECT Inventory.Item, 
    Inventory.ItemAlternative, 
    Inventory.OnHandPhys, 
    Inventory.Allocated, 
    Inventory.CostPrice, 
    replace(vInventoryOptional2Values.Value, '/', '') AS Brand, 
    Inventory.Optional3 AS StockStatus, 
    l.QtySoldInPeriod, 
    l.QtySoldInPeriod2 
FROM (
    SELECT lines.item, 
     -SUM(lines.Invoiced) AS QtySoldInPeriod, 
     SUM(lines.CostAmount - lines.AmountBase) AS QtySoldInPeriod2 
    FROM lines 
    WHERE lines.Invoiced < 0 
     AND lines.Date >= '2014-01-01' 
     AND lines.Date <= '2014-01-31' 
    GROUP BY Lines.Item) l 
INNER JOIN inventory ON l.item = Inventory.item 
    AND Inventory.Status = 0 
    AND Inventory.Optional3 <> 3 
INNER JOIN vInventoryOptional2Values ON Inventory.Optional2 = vInventoryOptional2Values.RecordID 
+0

Кстати ваш исходный запрос должен был возвратить много строк с 0 SUM, потому что вы также возвращаете элементы из определенного диапазона дат –

Смежные вопросы