Объединение таблиц на SQL сервере для получения всех данных - PullRequest
0 голосов
/ 29 мая 2020

У меня есть 3 таблицы:

Customer
Customer    |Name
1002        |ABB
2006        |Aberdeen C
.
.

И таблица доходов от продаж

Customer|Inv.   |Product    |Sales Amount   |Gross Margin
1002    |600    |5      |8000       |125
1002    |601    |20     |0      |-10
1002    |602    |0      |320        |160
2006    |603    |7      |120        |0
.
.

Таблица дебиторской задолженности

Customer|Inv.   |Product    |Balance    |Line Amount    |Amount
1002    |500    |0      |150        |NULL       |150    
1002    |600    |5      |8000       |8000       |8000
1002    |601    |20     |0      |0      |0
1002    |602    |0      |0      |160        |160
2006    |603    |7      |120        |120        |0
.
.

Я хочу создать представление клиента присоединившись к таблице доходов от продаж и дебиторской задолженности как:

Customer|Name|Inv.|Product|Sales Amount |Gross Margin   |Balance    |Line Amount
1002    |ABB |500 |0      |NULL     |NULL       |150        |150
1002    |ABB |600 |5      |8000     |125        |8000       |8000
1002    |ABB |601 |20     |0        |-10        |0      |0
1002    |ABB |602 |0      |320      |160        |160        |160
2006    |ABB |603 |7      |120      |0      |120        |0
.
.

Я пробовал

CREATE  or alter   VIEW [dbo].[custmermasterview] as
SELECT [Customer]
      ,[Name]
      ,[Inv]
      ,[Sales Amount]
      ,[Gross Margin]
      ,[Balance]
      ,isnull([Line Amount],[Amount]) as LineAmount
      ,[dbo].[SalesRevenue].[product_key]

  FROM [PDI].[dbo].[Customer]
  LEFT JOIN [dbo].[SalesRevenue] ON 
   ([PDI].[dbo].[Customer].[customer_key] = [dbo].[SalesRevenue].[customer_key] and 
  LEFT JOIN [dbo].[AccountReceivables] ON
  ([dbo].[SalesRevenue].[Inv] = [dbo].[AccountReceivables].Inv)

Очевидно, он остался присоединенным к SalesRevenue, поэтому записи из AccountReceivables не извлекаются. Как я могу получить требуемый результат?

Ответы [ 2 ]

0 голосов
/ 29 мая 2020

Вы можете добавить подзапрос, который получает все счета из обеих таблиц и присоединиться к этому подзапросу:

SELECT [Customer]
      ,[Name]
      ,[Inv]
      ,[Sales Amount]
      ,[Gross Margin]
      ,[Balance]
      ,isnull([Line Amount],[Amount]) as LineAmount
      ,[dbo].[SalesRevenue].[product_key]

  FROM [PDI].[dbo].[Customer]
  JOIN (    SELECT DISTINCT [customer_key] , inv, product
        FROM [dbo].[AccountReceivables]
        UNION
        SELECT DISTINCT [customer_key] , inv, product
        FROM [dbo].[SalesRevenue]
    ) all
  LEFT JOIN [dbo].[SalesRevenue] ON 
    [dbo].[SalesRevenue].[customer_key] = all.[customer_key]  
    and [SalesRevenue].inv = all.inv
    and [SalesRevenue].product = all.product 

  LEFT JOIN [dbo].[AccountReceivables] ON
    all.[Inv] = [dbo].[AccountReceivables].Inv
    and [AccountReceivables].inv = all.inv
    and [AccountReceivables].product = all.product 
0 голосов
/ 29 мая 2020

Это немного сложно проверить, но я думаю, что это сработает

SELECT [Customer]
  ,[Name]
  ,[Inv]
  ,[Sales Amount]
  ,[Gross Margin]
  ,[Balance]
  ,isnull([Line Amount],[Amount]) as LineAmount
  ,[dbo].[SalesRevenue].[product_key]

  FROM [PDI].[dbo].[Customer]
  LEFT JOIN [dbo].[SalesRevenue] ON 
   ([PDI].[dbo].[Customer].[customer_key] = [dbo].[SalesRevenue].[customer_key]  
  LEFT JOIN [dbo].[AccountReceivables] ar ON
  ([dbo].[SalesRevenue].[Inv] = [dbo].[AccountReceivables].Inv)
  OR 
  ([PDI].[dbo].[Customer].[customer_key] = [dbo].[AccountReceivables].[customer] 
    AND NOT EXISTS(SELECT NULL FROM [dbo].[SalesRevenue] sr WHERE sr.[Inv] = ar.[Inv] and 
    sr.[customer] = ar.[customer] ) )

Я добавил несколько псевдонимов к таблицам, чтобы их было немного легче объединить. кроме того, в вашем запросе для соединения используется customer_key, но в ваших таблицах указано customer?

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