Получить несколько строк из подзапроса SQL - PullRequest
2 голосов
/ 20 марта 2019

В основном у меня есть 2 таблицы: первая с количеством сырья (QT) для каждого серийного номера, а вторая с тем, сколько сырья было израсходовано (Qt_Added) на производство партии.Как это:

Таблица 1

+----------+------------+-----+
| Code_Raw | Serial_Raw | Qt  |
+----------+------------+-----+
|        1 |          1 | 100 |
|        1 |          2 | 150 |
|        2 |          1 |  80 |
|        1 |          3 | 100 |
+----------+------------+-----+

И Таблица 2

+------------+----------+------------+----------+--+
| Code_Batch | Code_Raw | Serial_Raw | Qt_Added |  |
+------------+----------+------------+----------+--+
|          1 |        1 |          1 |       80 |  |
|          2 |        1 |          1 |       10 |  |
|          3 |        1 |          2 |      150 |  |
|          4 |        1 |          3 |       80 |  |
+------------+----------+------------+----------+--+

Я попытался сделать запрос для конкретного Code_Raw, покажите мне, сколько осталосьдля каждого серийного номера, но работает только при наличии одного serial_raw.

Мой запрос:

select * 
from 
    (select 
         Serial_Raw,
         (Select QT From Table_1 where Code_Raw = 1) - Sum(qt_added) as Total_Remaining 
     from
         Table_2
     where 
         Cod_Raw = 1
     group by 
         Serial_Raw) e
where 
    Total_Remaining > 0

, но он выдает эту ошибку

Подзапрос возвращенболее 1 значение.Это недопустимо, если подзапрос следует =,! =, <, <=,>,> = Или когда подзапрос используется как выражение

И я ожидаю:

Serial_Raw     Total_Remaining
-------------------------------
    1                10
    3                20

Есть проблема структуры или другой способ сделать это?

Я использую SQL Server 2014

Спасибо, ребята

Ответы [ 2 ]

2 голосов
/ 20 марта 2019

Попробуйте это:

DECLARE @tbl1 TABLE
(   CodeRaw INT,
    Serial_Raw     INT,
    Qty INT)


DECLARE @tbl2 TABLE
(   
    CodeBatch INT,
    CodeRaw INT,
    Serial_Raw     INT,
    QtyAdded    INT)

    INSERT INTO @tbl1 VALUES(1,1,100)
    INSERT INTO @tbl1 VALUES(1,2,150)
    INSERT INTO @tbl1 VALUES(2,1,80)
    INSERT INTO @tbl1 VALUES(1,3,100)

    INSERT INTO @tbl2 VALUES(1,1,1,80)
    INSERT INTO @tbl2 VALUES(2,1,1,10)
    INSERT INTO @tbl2 VALUES(3,1,2,150)
    INSERT INTO @tbl2 VALUES(4,1,3,80)

    --Inner table has the summary of the Quantity added with columns CodeRaw and SerialRaw. Outer table make join with inner table and just substruct with the Qty and Sum of Qty Added.  
    SELECT t2.Serial_Raw, t1.Qty - t2.QtyAdded AS Total_Remaining  FROM @tbl1 t1
        INNER JOIN (SELECT CodeRaw, Serial_Raw , SUM(QtyAdded) QtyAdded FROM @tbl2
                    GROUP BY CodeRaw, Serial_Raw) AS t2 ON t2.CodeRaw = t1.CodeRaw AND t1.Serial_Raw = t2.Serial_Raw
    WHERE t1.Qty - t2.QtyAdded > 0   
1 голос
/ 20 марта 2019

Если я вас правильно понял, это может быть то, что вы после

declare @tbl1 table (CodeRaw INT, Serial_Raw INT, Qty INT)
declare @tbl2 table (CodeBatch INT, CodeRaw INT, Serial_Raw INT, QtyAdded INT)

insert into @tbl1 values (1,1,100), (1,2,150), (2,1,80), (1,3,100)
insert into @tbl2 values (1,1,1,80), (2,1,1,10), (3,1,2,150), (4,1,3,80)

select t2.Serial_Raw,
       t3.Qty - sum(t2.QtyAdded) as Total_Remaining
from   @tbl2 t2
  inner join ( select t1.Serial_Raw,
                      t1.CodeRaw,
                      sum(t1.Qty) as Qty
               from   @tbl1 t1
               group by t1.Serial_Raw, t1.CodeRaw
             ) t3
             on t2.Serial_Raw = t3.Serial_Raw
            and t2.CodeRaw = t3.CodeRaw 
group by t2.Serial_Raw, t3.Qty

Так что в t2 мы получаем все различные Serial_Raw значения и суммируем их QtyAdded из первой таблицы.
В t3 мы получаем все Qty значения из 2-й таблицы.
Все, что нам нужно сделать, это объединить их и вычесть

Результат этого запроса

Serial_Raw  Total_Remaining 
----------  --------------- 
1           10  
2            0  
3           20  
...