Мне нужно написать SQL по схеме «звезда», где у меня есть продукты с поставщиком в одном городе и потребителем в другом и наоборот - PullRequest
0 голосов
/ 10 июля 2019

У меня есть звездообразная схема с транзакциями в виде таблицы фактов.

Для каждого списка продуктов количество, проданное поставщиками в Мэдисоне потребителям в Чикаго, и количество, проданное поставщиками в Чикаго потребителям в Мадисоне (столбцы результата: название продукта, количество Madison_Chicago, количество Chicago_Madison)

Я пытался пересечь и объединить все

SELECT 
    P.Name as Product
   , SUM(T.Quantity) as QMad
   , dbo.Tb_Consumer C
   , dbo.Tb_Supplier S
   , dbo.Tb_Transactions T
   where P.Prod_ID = T.Prod_ID
   and C.Con_ID = T.Con_ID
   and S.Supp_ID = T.Supp_ID
   and S.City = 'Madison'
   and C.City = 'Chicago'
  from dbo.Tb_Product P
  group by P.Name
  union all
  SELECT P.Name as Product
  , sum(T.Quantity) as QCHI
  from dbo.Tb_Product P
  , dbo.Tb_Consumer C
  ,dbo.Tb_Supplier S
  ,dbo.Tb_Transactions T
  where P.Prod_ID = T.Prod_ID
  and C.Con_ID = T.Con_ID
  and S.Supp_ID = T.Supp_ID
  and S.City = 'Chicago'
  and C.City = 'Madison'
  group by P.Name

Ожидается следующее

Product   chi_qy   Mad_qy
-------------------------
Auto       3        2

но я получаю

Product   chi_qy    
----------------- 
Auto       3        
Auto       2

1 Ответ

0 голосов
/ 10 июля 2019

просто объедините два запроса вместо объединения следующим образом:

select X.Product,QMad,QCHI
from(
SELECT 
    P.Name as Product
   , SUM(T.Quantity) as QMad
   from dbo.Tb_Product P
   , dbo.Tb_Consumer C
   , dbo.Tb_Supplier S
   , dbo.Tb_Transactions T
   where P.Prod_ID = T.Prod_ID
   and C.Con_ID = T.Con_ID
   and S.Supp_ID = T.Supp_ID
   and S.City = 'Madison'
   and C.City = 'Chicago'
  from dbo.Tb_Product P
  group by P.Name) X
inner join
  (SELECT P.Name as Product
  , sum(T.Quantity) as QCHI
  from dbo.Tb_Product P
  , dbo.Tb_Consumer C
  ,dbo.Tb_Supplier S
  ,dbo.Tb_Transactions T
  where P.Prod_ID = T.Prod_ID
  and C.Con_ID = T.Con_ID
  and S.Supp_ID = T.Supp_ID
  and S.City = 'Chicago'
  and C.City = 'Madison'
  group by P.Name) Y on X.Product=Y.Product

, и если он может быть пустым с каждой стороны, вы можете использовать левое, правое или полное внешнее объединение

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...