Я пытаюсь понять, как сгруппировать значения вместе, чтобы добавить индикатор. Я хочу «исправить» значения и на их основе атрибутировать индикатор.
Значения, которые я пытаюсь сгруппировать, — это дата, имя клиента и тип продукта, чтобы создать индикатор, который фиксирует, какой тип заказа был размещен (только фрукты, фрукты и овощи, только овощи). Цель состоит в том, чтобы рассчитать общий объем каждого типа размещенного заказа. Данные расположены следующим образом, а столбец, который я пытаюсь создать, — это «Тип заказа».
Что я сделал до сих пор:
Утверждения дела
CASE WHEN Product_Type = 'Fruit' THEN 1 ELSE 0 END AS Fruit_Indicator
, CASE WHEN Product_Type = 'Vegetable' THEN 1 ELSE 0 END AS Veg_Indicator
Постановка случая с разделением и порядком по
, CASE WHEN ROW_NUMBER() OVER (PARTITION BY Order_Date, Customer ORDER BY Order_Date ASC) = 1 AND Product_Type = 'Fruit' THEN 1 ELSE NULL END AS Fruit_Ind
, CASE WHEN ROW_NUMBER() OVER (PARTITION BY Order_Date, Customer ORDER BY Order_Date ASC) = 1 AND Product_Type = 'Vegetable' THEN 1 ELSE NULL END AS Veg_Ind
Буду признателен за любые указания в правильном направлении.
Спасибо!
Привет, спасибо за ваш комментарий и ссылки на эти темы. Я отредактировал свой первоначальный вопрос.
У вас больше шансов получить ответ, если вы предоставите данные в виде текста, а не изображений. Также уточните цель - это сгенерировать «отчет», который вы показываете на изображении, или подсчитать количество заказов каждого типа или что-то совсем другое?
КАЖЕТСЯ, вы пытаетесь получить данные, сгруппированные по дате, например, 21 марта, 22 марта и т. д. Итак, вы можете захотеть иметь вторичный запрос для присоединения к первичным данным. Второй запрос будет сводным по клиенту и дате. Если поле даты ориентировано на дату/время, вам придется настроить группу, чтобы получить правильно отформатированный контекст, такой как формат даты, используя месяц/день/год и игнорируя любой компонент времени. Это также может быть обработано функцией, которая просто получает часть даты и игнорирует время. Затем ваши исходные данные в совокупности должны дать вам то, что вам нужно. Может что-то вроде.
select
yt.date,
yt.customer,
yt.product,
yt.productType,
case when PreQuery.IsFruit > 0 and PreQuery.IsVegetable > 0
then 'Fruit & Vegetable'
when PreQuery.IsFruit > 0 and PreQuery.IsVegetable = 0
then 'Fruit Only'
when PreQuery.IsFruit = 0 and PreQuery.IsVegetable > 0
then 'Vegetable Only' end OrderType
from
YourTable yt
JOIN
( select
yt2.customer,
yt2.date,
max( case when yt2.ProductType = 'Fruit'
then 1 else 0 end ) IsFruit,
max( case when yt2.ProductType = 'Vegetable'
then 1 else 0 end ) IsVegetable
from
YourTable yt2
-- if you want to restrict time period, add a where
-- clause here on the date range as to not query entire table
group by
yt2.customer,
yt2.date ) PreQuery
ON yt.customer = PreQuery.customer
AND yt.date = PreQuery.date
-- same here for your outer query to limit just date range in question.
-- if you want to restrict time period, add a where
-- clause here on the date range as to not query entire table
order by
yt.date,
yt.customer,
yt.product
Спасибо за ваш ответ - это то, что я искал. Я не думал о создании второго запроса для группировки клиентов и дат.
Можете ли вы показать нам, что вы сделали до сих пор? предполагается, что вы попытаетесь написать код самостоятельно. После проводить больше исследований, если у вас есть проблема, вы можете опубликовать то, что вы пробовали, с четким объяснением того, что не работает, и предоставить Минимальный, полный и проверяемый пример. Предлагаю прочитать Как спросить хороший вопрос