Объединить результаты из двух таблиц в один общий столбец - PullRequest
0 голосов
/ 01 ноября 2019

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

Мне нужно составить отчет (цель состоит в том, чтобы использовать Microsoft PowerBi), чтобы показать расхождения между различными запасами для одного и того же склада (местоположение), но единственным общим столбцом является номер склада.

Столбец товара динамически : он может появляться в инвентаре, а не в другом (и это именно то, что нам нужно знать)

Каждый инвентарь находится в отдельноститаблица, как это:

TABLE A     
LOCATION    PRODUCTS           QTY
WH 1        PRODUCT NO. 1      10
WH 1        PRODUCT NO. 2      100
WH 1        PRODUCT NO. 333    5
WH 2        PRODUCT NO. YYY    22

TABLE B     
LOCATION    PRODUCTS            QTY
WH 1        PRODUCT NO. 1       10
WH 1        PRODUCT NO. 2       100
WH 1        PRODUCT NO. 333     5
WH 1        PRODUCT NO. XXX     77
WH 2        PRODUCT NO. YYY     45
WH 1        PRODUCT NO. YYY     555
WH 2        PRODUCT NO. 1       14

Ожидаемый результат должен быть таким:

Location    products           QTY A    QTY B
WH 1        PRODUCT NO. 1      10       10
WH 1        PRODUCT NO. 2      100      100
WH 1        PRODUCT NO. 333    5        5
WH 1        PRODUCT NO. XXX    -        77
WH 1        PRODUCT NO. YYY    -        555
WH 2        PRODUCT NO. 1      -        14
WH 2        PRODUCT NO. YYY    22       45

Я читал о FULL OUTER JOIN, а также PIVOT TABLES, но я не смог полностью понятьи использовать их (и я также не уверен, что они являются целью здесь).

Версия SQL - это стандарт Microsoft SQL Server 2016

Ответы [ 3 ]

2 голосов
/ 01 ноября 2019

Один из вариантов - Union ALL совместно с PIVOT или условной агрегацией

Пример

Select *
 From  (
        Select Location
              ,Products
              ,Qty
              ,Col = 'Qty A'
         From  Table A
        Union All
        Select Location
              ,Products
              ,Qty
              ,Col = 'Qty B'
         From  Table B
       ) src
 Pivot (sum(Qty) for Col in ([Qty A],[Qty B] ) ) pvt
1 голос
/ 01 ноября 2019

Разве это не простое полное соединение? Я что-то пропустил? Pivot здесь не нужен.

select isnull(A.location,B.location) location, isnull(A.products, B.products) products,
   A.QTY A_QTY, B.QTY B_QTY
from tableA A
full outer join tableB B
   on A.location = B.location
   and A.products = B.products

A_QTY или B_QTY будет нулевым, если он находится в одной таблице, но не в другой.

0 голосов
/ 01 ноября 2019

Попробуйте:

;with tableA (LOCATION, PRODUCTS,   QTY)
as
(
select 'WH 1','PRODUCT NO. 1',10
union all
select  'WH 1','PRODUCT NO. 2',100
union all
select  'WH 1','PRODUCT NO. 333',5
union all
select  'WH 2','PRODUCT NO. YYY',22
)
, tableB (LOCATION, PRODUCTS,   QTY)
as
(
select 'WH 1','PRODUCT NO. 1',10
union all
select 'WH 1','PRODUCT NO. 2',100
union all
select 'WH 1','PRODUCT NO. 333',5
union all
select 'WH 1','PRODUCT NO. XXX',77
union all
select 'WH 2','PRODUCT NO. YYY',45
union all
select 'WH 1','PRODUCT NO. YYY',555
union all
select 'WH 2','PRODUCT NO. 1',14
)

select
    LOCATION
,   PRODUCTS
,   isnull(QtyA,0) [Qty A]
,   isnull(QtyB,0) [Qty B]
from
(
select
    LOCATION
,   PRODUCTS
,   QTY
,   'QtyA'  ColumnQty
from    tableA
union all
select
    LOCATION
,   PRODUCTS
,   QTY
,   'QtyB'  ColumnQty
from    tableB
) source
pivot
(
sum(QTY) for ColumnQty in ([QtyA],[QtyB])
) pvt

Я проверил это, и оно работает, как можно увидеть здесь.

...