Как я могу получить только количество первой квитанции в SQL

#sql #snowflake-cloud-data-platform

Вопрос:

Я пытаюсь запустить SQL, в котором я хочу увидеть первый номер поступления номера заказа на покупку и количество, полученное по первому номеру поступления.

Мой SQL извлекает первый номер квитанции, но я не получаю количество для первого номера квитанции, вместо этого я получаю общее количество приема номера puchase

вот мой SQL:

 Select
  a.Purchase_Order_Number,
  min(b.Purchase_Receipt_Number) PO_Receipt_NUMBER,  
  min(c.Full_Date) Received_Date,
  sum(b.TRANSACTION_RECEIVED_ITEM_QUANTITY)  PO_Receive_Qty
from f_Purchase_Order    a
join f_Purchase_Receipt b
  on a.Purchase_Order_Key = b.Purchase_Order_Key
join d_Date    c
  on (b.Received_Date_Key = c.Date_Key)
where a.Purchase_Order_Number = '870892'
group by 
  a.Purchase_Order_Number
 

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

1. Не могли бы вы заменить sum на first_value и посмотреть, работает ли это тоже? Оставив все точно так, как вы написали в первый раз . Возможно, вам подойдет больше, чем переписывать

Ответ №1:

Если вам нужен первый ряд, не используйте GROUP BY . ORDER BY и LIMIT :

 Select po.Purchase_Order_Number,
       pr.Purchase_Receipt_Number,  
       d.Full_Date as Received_Date,
       pr.TRANSACTION_RECEIVED_ITEM_QUANTITY as PO_Receive_Qty
from f_Purchase_Order po join
     f_Purchase_Receipt pr
     on po.Purchase_Order_Key = pr.Purchase_Order_Key join
     d_Date d
     on pr.Received_Date_Key = d.Date_Key
where pr.Purchase_Order_Number = '870892'
order by d.Date_Key
limit 1;
 

Обратите внимание, что я также исправил псевдонимы таблиц, чтобы они идентифицировали таблицы, из которых они взяты.

Редактировать:

Если вы хотите этого для всех Purchase_Order_Numbers , вы бы использовали qualify :

 Select po.Purchase_Order_Number,
       pr.Purchase_Receipt_Number,  
       d.Full_Date as Received_Date,
       pr.TRANSACTION_RECEIVED_ITEM_QUANTITY as PO_Receive_Qty
from f_Purchase_Order po join
     f_Purchase_Receipt pr
     on po.Purchase_Order_Key = pr.Purchase_Order_Key join
     d_Date d
     on pr.Received_Date_Key = d.Date_Key
order by d.Date_Key
qualify row_number() over (partition by Purchase_Order_Key order d.Date_Key) = 1;
 

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

1. спасибо теперь, как бы я получил весь первый номер квитанции каждого другого заказа на покупку при удалении пункта «ГДЕ».

2. @kodycarl . . . По иронии судьбы, это был мой первый ответ, который я затем переписал. Вы бы использовали qualify .

Ответ №2:

Вы суммируете ТРАНЗАКЦИЮ_РЕЗУЛЬТАТ_ИТЕМ_КОЛИЧЕСТВО по всем позициям в номере заказа на покупку (из-за «группировать по»). То, что вам действительно нужно, — это просто информация из номера первой покупки_рецепт_номера. Вы можете сделать это с помощью «топ-1» и «заказ по».

 Select top 1
  a.Purchase_Order_Number,
  b.Purchase_Receipt_Number,  
  c.Full_Date,
  b.TRANSACTION_RECEIVED_ITEM_QUANTITY
from f_Purchase_Order    a 
join f_Purchase_Receipt b
  on a.Purchase_Order_Key = b.Purchase_Order_Key
join d_Date    c
  on (b.Received_Date_Key = c.Date_Key)
where a.Purchase_Order_Number = '870892'
order by
a.Purchase_Receipt_Number
 

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

1.спасибо теперь, как бы я получил весь первый номер квитанции каждого другого заказа на покупку при удалении пункта «ГДЕ».