Как объединить две таблицы в одном представлении? - PullRequest
1 голос
/ 11 июня 2019

Я пытаюсь создать представление, в котором я могу видеть товары, которые были запланированы к отправке и не были отправлены, а товары были отправлены, но не были запланированы. Для этого у меня есть 2 таблицы с разными данными.

Таблица SC (фактически поставляется):

+---------+-----------------+----------------------+-------------+
| item_id | source_location | destination_location | shipped_qty |
+---------+-----------------+----------------------+-------------+
| 001     |    California   |    South_Carolina    |      80     |
+---------+-----------------+----------------------+-------------+
| 001     |    California   |    South_Carolina    |      0      |
+---------+-----------------+----------------------+-------------+
| 001     |    California   |         Texas        |      20     |
+---------+-----------------+----------------------+-------------+
| 003     |      Texas      |    South_Carolina    |     200     |
+---------+-----------------+----------------------+-------------+
| 004     |  South_Carolina |         Texas        |      30     |
+---------+-----------------+----------------------+-------------+
| 004     |  South_Carolina |         Texas        |      10     |
+---------+-----------------+----------------------+-------------+

Таблица SO (план доставки товаров):

+---------+-----------------+----------------------+---------------+
| item_id | source_location | destination_location | planned_order |
+---------+-----------------+----------------------+---------------+
| 001     |    California   |    South_Carolina    |      100      |
+---------+-----------------+----------------------+---------------+
| 001     |    California   |    South_Carolina    |      100      |
+---------+-----------------+----------------------+---------------+
| 001     |    California   |         Texas        |       10      |
+---------+-----------------+----------------------+---------------+
| 003     |      Texas      |    South_Carolina    |      200      |
+---------+-----------------+----------------------+---------------+
| 004     |  South_Carolina |         Texas        |      300      |
+---------+-----------------+----------------------+---------------+
| 004     |  South_Carolina |         Texas        |      50       |
+---------+-----------------+----------------------+---------------+

Так, в этом случае, например, поскольку элемент 001 имеет три разных плановых заказа из Калифорнии в Южную Каролину, я не хочу, чтобы он отображал все три заказа в представлении, я хочу, чтобы он был только в одном строка, но сумма все запланированные заказы вместе, как показано ниже.

Желаемый результат:

+---------+----------------+-----------------+-------------+-------------+
| item_id |   source_loc   | destination_loc | shipped_qty | planned_qty |
+---------+----------------+-----------------+-------------+-------------+
| 001     |   California   |  South_Carolina |      80     | 200         |
+---------+----------------+-----------------+-------------+-------------+
| 001     |   California   |      Texas      |      20     | 10          |
+---------+----------------+-----------------+-------------+-------------+
| 003     |      Texas     |  South_Carolina |     200     | 200         |
+---------+----------------+-----------------+-------------+-------------+
| 004     | South_Carolina |      Texas      |      40     | 350         |
+---------+----------------+-----------------+-------------+-------------+

Я пробовал это до сих пор:

SELECT  o.source_location,
        o.destination_location,
        o.item_id,
        o.planned_order,
        c.shipped_qty
        FROM SO_TRANSFER o, SC_TRANSFER c   

Но это не сработало, так как shipped_qty не соответствует элементу, и этот код также не добавляет заказы вместе.

Кстати, я использую Microsoft SQL Server 2012. Спасибо!

Ответы [ 5 ]

3 голосов
/ 11 июня 2019

Я думаю, что вы хотите:

select coalesce(s.item_id, p.item_id) as item_id,
       coalesce(s.source_location, p.source_location) as source_location,
       coalesce(s.destination_location, p.destination_location) as destination_location,
       coalesce(s.shipped_qty, 0) as shipped_qty,
       coalesce(planned_qty, 0) as planned_qty
from (select item_id, source_location, destination_location, sum(shipped_qty) as shipped_qty
      from sc
      group by item_id, source_location, destination_location
     ) s full join
     (select item_id, source_location, destination_location, sum(planned_qty) as planned_qty
      from so
      group by item_id, source_location, destination_location
     ) p
     on s.item_id = p.item_id and
        s.source_location = p.source_location and
        s.destination_location = p.destination_location;
1 голос
/ 11 июня 2019

Вы можете попробовать это:

SELECT A.item_id,
       A.source_location AS source_loc,
       A.destination_location AS destination_loc,
       A.shipped_qty,
       B.planned_order
FROM 
      (SELECT item_id,source_location,destination_location,SUM(shipped_qty) 
      AS shipped_qty
      FROM SC GROUP BY item_id,source_location,destination_location) A, 

      (SELECT item_id,source_location,destination_location,SUM(planned_order) 
      AS planned_order
      FROM SO GROUP BY item_id,source_location,destination_location) B

WHERE A.item_id = B.item_id AND 
      A.source_location= B.source_location AND
      A.destination_location= B.destination_location

РЕДАКТИРОВАТЬ: я просто понимаю, что мой ответ похож на ответ Гордона Линоффа , и его ответ получил больше возможностей, таких как обработка данных, которые существуют в одной таблице только с использованием COALESCE в T- SQL и FULL JOIN свойство. Поскольку я работал 1 час на этот ответ, поэтому я просто оставлю это здесь.

0 голосов
/ 11 июня 2019

Следующий запрос сделает то, что вы ищете

 Create table #SC(
item_id varchar(50),
source_location varchar(max),
Destination_location varchar(max),
Shipped_qty int)

insert into #SC values('001','california','sourth_carolian',80)
insert into #SC values('001','california','sourth_carolian',0)
insert into #SC values('001','california','Texas',20)
insert into #SC values('003','Texas','sourth_carolian',200)
insert into #SC values('004','sourth_carolian','Texas',30)
insert into #SC values('004','sourth_carolian','Texas',10)
--select * from #SC

Create table #SO(
item_id varchar(50),
source_location varchar(max),
Destination_location varchar(max),
Planned_order int)


insert into #SO values('001','california','sourth_carolian',100)
insert into #SO values('001','california','sourth_carolian',100)
insert into #SO values('001','california','Texas',10)
insert into #SO values('003','Texas','sourth_carolian',200)
insert into #SO values('004','sourth_carolian','Texas',300)
insert into #SO values('004','sourth_carolian','Texas',50)

--select * from #SO


select C.item_id,C.source_location,C.Destination_location, sum(C.Shipped_qty) as Shipped_qty, po.planned_order from #SC  C

outer apply 
(select sum(Planned_order) as planned_order from #SO  
where source_location+Destination_location=C.source_location+C.Destination_location
group by item_id,source_location,Destination_location  ) as PO 

group by C.item_id,C.source_location,C.Destination_location,po.planned_order
0 голосов
/ 11 июня 2019

Дело в том, что сначала вы должны SUM (количество) из каждой таблицы, затем вы можете легко присоединиться к таблице 2 с условием: ON so.item_id = sc.item_id AND so.source_loc = sc.source_loc AND so.destination_loc = sc.destination_loc

0 голосов
/ 11 июня 2019

Вы можете создать оператор SELECT и использовать его в качестве таблицы в предложении FROM:

SELECT o.source_location,
       o.destination_location,
       o.item_id,
       o.planned_order,
       c.shipped_qty_sum
FROM SO_TRANSFER o
INNER JOIN (SELECT SUM(shipped_qty) AS shipped_qty_sum,
                   source_location,
                   item_id
            FROM SC_TRANSFER
            GROUP BY source_location, item_id) c
ON o.item_id = c.item_id AND o.source_location = c.source_location
...