#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;