Как объединить две таблицы и получить полные данные с учетом бренда клиента?

#sql #sql-server

#sql #sql-сервер

Вопрос:

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

в третьем столбце я хочу иметь подробную информацию обо всех продуктах по бренду клиента.

Например:

Я продаю 4 разные модели телефонов Samsung, и есть клиент, который купил у меня только две модели. Таким образом, есть вероятность, что я смогу продать ему и другой продукт той же марки.

Я прикрепляю изображение, где у меня есть таблица 1 и таблица 2, и мне нужны данные в соответствии с таблицей 3

Я попробовал полное внешнее объединение

 with cte as
(select Sales_Manager_ProductAnalysisTable.Customer, ProductMasterfromSales.Brand,ProductMasterfromSales.product
from ProductMasterfromSales
cross join Sales_Manager_ProductAnalysisTable
group by Sales_Manager_ProductAnalysisTable.Customer, ProductMasterfromSales.Brand,ProductMasterfromSales.product
)
select cte.Customer,cte.Brand, cte.product,
   case when Sales_Manager_ProductAnalysisTable.product is null or Sales_Manager_ProductAnalysisTable.Brand is null then 0 else Sales_Manager_ProductAnalysisTable.jan end as jan,
    case when Sales_Manager_ProductAnalysisTable.product is null or Sales_Manager_ProductAnalysisTable.Brand is null then 0 else Sales_Manager_ProductAnalysisTable.feb end as feb,
     case when Sales_Manager_ProductAnalysisTable.product is null or Sales_Manager_ProductAnalysisTable.Brand is null then 0 else Sales_Manager_ProductAnalysisTable.feb end as Mar,
      case when Sales_Manager_ProductAnalysisTable.product is null or Sales_Manager_ProductAnalysisTable.Brand is null then 0 else Sales_Manager_ProductAnalysisTable.feb end as Apr,
       case when Sales_Manager_ProductAnalysisTable.product is null or Sales_Manager_ProductAnalysisTable.Brand is null then 0 else Sales_Manager_ProductAnalysisTable.feb end as May,
        case when Sales_Manager_ProductAnalysisTable.product is null or Sales_Manager_ProductAnalysisTable.Brand is null then 0 else Sales_Manager_ProductAnalysisTable.feb end as Jun,
         case when Sales_Manager_ProductAnalysisTable.product is null or Sales_Manager_ProductAnalysisTable.Brand is null then 0 else Sales_Manager_ProductAnalysisTable.feb end as Jul,
          case when Sales_Manager_ProductAnalysisTable.product is null or Sales_Manager_ProductAnalysisTable.Brand is null then 0 else Sales_Manager_ProductAnalysisTable.feb end as Aug,
           case when Sales_Manager_ProductAnalysisTable.product is null or Sales_Manager_ProductAnalysisTable.Brand is null then 0 else Sales_Manager_ProductAnalysisTable.feb end as Sep,
            case when Sales_Manager_ProductAnalysisTable.product is null or Sales_Manager_ProductAnalysisTable.Brand is null then 0 else Sales_Manager_ProductAnalysisTable.feb end as Oct,
             case when Sales_Manager_ProductAnalysisTable.product is null or Sales_Manager_ProductAnalysisTable.Brand is null then 0 else Sales_Manager_ProductAnalysisTable.feb end as Nov,
              case when Sales_Manager_ProductAnalysisTable.product is null or Sales_Manager_ProductAnalysisTable.Brand is null then 0 else Sales_Manager_ProductAnalysisTable.feb end as Dev
from cte
left join Sales_Manager_ProductAnalysisTable on Sales_Manager_ProductAnalysisTable.Customer = cte.Customer and Sales_Manager_ProductAnalysisTable.Brand = cte.Brand and Sales_Manager_ProductAnalysisTable.product = cte.product; 


 --------- --------------------- ---------- ------ ------ ------ ------ ------ ------ ------ ------ ------ ------ ------ ------ 
| Brand   | Customer            | Product  | Jan  | Feb  | Mar  | Apr  | May  | Jun  | Jul  | Aug  | Sep  | Oct  | Nov  | Dec  |
 --------- --------------------- ---------- ------ ------ ------ ------ ------ ------ ------ ------ ------ ------ ------ ------ 
| Samsung | viaCom Technologies | Note 10  | NULL | 1980 | NULL | NULL | NULL | 2640 | NULL | NULL | NULL | NULL | NULL | NULL |
 --------- --------------------- ---------- ------ ------ ------ ------ ------ ------ ------ ------ ------ ------ ------ ------ 
| Samsung | viaCom Technologies | Note 9   | NULL | 0    | 360  | NULL | NULL | NULL | -92  | -8   | NULL | NULL | NULL | NULL |
 --------- --------------------- ---------- ------ ------ ------ ------ ------ ------ ------ ------ ------ ------ ------ ------ 
| Samsung | viaCom Technologies | Iphone 8 | NULL | NULL | NULL | NULL | NULL | 100  | NULL | NULL | NULL | NULL | NULL | NULL |
 --------- --------------------- ---------- ------ ------ ------ ------ ------ ------ ------ ------ ------ ------ ------ ------ 
  

введите описание изображения здесь

Комментарии:

1. Вы должны сначала попробовать сами, а затем добавить этот код в свой вопрос

2. Я бы начал с исправления таблицы 2. Таблица базы данных — это не электронная таблица.

3. Я пытался использовать полное внешнее объединение, но это был неудачный ход, поскольку он выбирает только названия продуктов, которые доступны в обеих таблицах. Я не большой специалист в SQL-запросах, поэтому, если вы, пожалуйста, поможете мне с логикой, пожалуйста, я обязательно попробую поделиться кодом

4. В mysql нет полного внешнего соединения, что заставляет меня задуматься, правильно ли помечен этот вопрос, и если да, то на какой версии mysql вы работаете?

5. Привет, я отредактировал тег, я использую MSSQL 18.

Ответ №1:

Сгенерируйте все комбинации клиент / продукт, используя cross join . Затем введите существующие данные.

На самом деле вам не нужны все комбинации, потому что вы ищете только бренды, которые есть у клиентов. Так join работает brand декартово произведение, которое вы хотите.

Попробуйте:

 select cb.customer, cb.brand, pms.product,
       coalesce(smpa.jan, 0) as jan,
       coalesce(smpa.feb, 0) as feb,
       . . . 
from (select distinct smpa.customer, smpa.brand
      from Sales_Manager_ProductAnalysisTable smpa
     ) cb join
     ProductMasterfromSales pms
     on pms.brand = smpa.brand left join
     Sales_Manager_ProductAnalysisTable smpa
     on smpa.customer = cb.customer and
        smpa.brand = cb.brand and
        smpa.product = pms.product
  
  

Комментарии:

1. Привет, это ошибка, не удалось привязать многосоставный идентификатор «smpa.Brand». для строки `на pms.brand = smpa.brand левое соединение`

2. @VarinderVerma . , , Возможно, имена таблиц расположены в неправильном порядке. Ваш вопрос довольно сложен для понимания, потому что имена меняются случайным образом по всему нему.

Ответ №2:

Подход: в cte получите отдельного клиента и уникальные бренды, у которых они приобрели. Объедините различные значения с таблицей брендов в brand (чтобы получить все продукты (купленные или нет). Затем слева присоединитесь к продажам (из таблицы2) для клиента и (всех) продуктов.

 ;with cbrand_cte(cust, brand) as (
    select distinct t2.[Customer Name], t1.brand
    from Table2 t2
         join Table1 t1 on t2.Product=t1.product)
select
  cc.[Customer Name], br.Brand, br.Product,
  isnull(sls.jan, 0) Jan, isnull(sls.feb, 0) Feb, isnull(sls.mar, 0) Mar, 
  isnull(sls.apr, 0) Apr, isnull(sls.may, 0) May 
from cbrand_cte cc
     join Table1 br on cc.brand=br.Brand
     left join Table2 sls on cc.[Customer Name]=sls.[Customer Name]
                             and br.product=sls.product;