как применить Group By к этому SQL-запросу - PullRequest
1 голос
/ 17 сентября 2009

Я пытаюсь составить список инвентаря для подсчета при условии, что товар был продан за последние 2 месяца: Я использую Pervasive SQL, и это таблица BusinessVision. Этот запрос работает, но я не знаю, как объединить, чтобы отображался один элемент:

SELECT "INVENTORY"."CODE", "INVENTORY"."INV_DESCRIPTION", 
"INVENTORY"."BVSTKUOM", "INVENTORY"."INV_COMMITTED", 
 "INVENTORY"."ONHAND",
"SALES_HISTORY_HEADER"."IN_DATE"
FROM "INVENTORY" INNER JOIN "SALES_HISTORY_DETAIL" ON "SALES_HISTORY_DETAIL"."CODE" = "INVENTORY"."CODE" INNER JOIN "SALES_HISTORY_HEADER" ON "SALES_HISTORY_HEADER"."NUMBER" = "SALES_HISTORY_DETAIL"."NUMBER"
    where "INVENTORY"."PROD" like 'A6O%' AND "SALES_HISTORY_HEADER"."IN_DATE" > '20090731'

Ok. Этот запрос даст мне повторные результаты с номером детали с разными датами. Я просто хочу иметь одно вхождение для каждого номера детали, если оно продано за последние 2 месяца. Например:

A6001-O15P   HP 700-101-O White 15" Perf   yds        0.00000      915.00000   20090810 
A6001-O15P   HP 700-101-O White 15" Perf   yds        0.00000      915.00000   20090811 
A6001-O15P   HP 700-101-O White 15" Perf   yds        0.00000      915.00000   20090812 

Я бы предпочел просто так:

A6001-O15P   HP 700-101-O White 15" Perf   yds        0.00000      915.00000

и в следующем ряду следующий товар. Как я могу это сделать?

РЕДАКТИРОВАННАЯ ЧАСТЬ ПОСЛЕ НЕКОТОРЫХ ОТВЕТОВ: Спасибо за предложение о DISTINCT. Я не знаю, почему это повторяет результаты еще. См. (Часть) результат запроса (не включая «SALES_HISTORY_HEADER». «IN_DATE»:

CODE           INV_DESCRIPTION                 BVSTKUOM   INV_COMMITTED   ONHAND    
--------------------------------------------------------- --------------- ----------
A6001-O15NP    HP 700-101-O White 15" NP       yds        0.00000         180.00000 
A6001-O15P     HP 700-101-O White 15" Perf     yds        0.00000         915.00000 
A6001-O15P     HP 700-101-O White 15" Perf     yds        0.00000         915.00000 
A6001-O15P     HP 700-101-O White 15" Perf     yds        0.00000         915.00000 
A6001-O15P     HP 700-101-O White 15" Perf     yds        0.00000         915.00000 
A6001-O15P     HP 700-101-O White 15" Perf     yds        0.00000         915.00000 
A6001-O15P     HP 700-101-O White 15" Perf     yds        0.00000         915.00000 
A6001-O15P     HP 700-101-O White 15" Perf     yds        0.00000         915.00000 
A6001-O15P     HP 700-101-O White 15" Perf     yds        0.00000         915.00000 
A6001-O15P     HP 700-101-O White 15" Perf     yds        0.00000         915.00000 
A6001-O15P     HP 700-101-O White 15" Perf     yds        0.00000         915.00000 
A6001-O15P     HP 700-101-O White 15" Perf     yds        0.00000         915.00000 
A6001-O15P     HP 700-101-O White 15" Perf     yds        0.00000         915.00000 
A6001-O15P     HP 700-101-O White 15" Perf     yds        0.00000         915.00000 
A6001-O15P     HP 700-101-O White 15" Perf     yds        0.00000         915.00000 

А при использовании GROUP BY или DISTINCT я получаю следующие результаты:

CODE           INV_DESCRIPTION                 BVSTKUOM   INV_COMMITTED   ONHAND    
--------------------------------------------------------- --------------- ----------
A6001-O15NP    HP 700-101-O White 15" NP       yds        0.00000         50.00000  
A6001-O15NP    HP 700-101-O White 15" NP       yds        0.00000         180.00000 
A6001-O15P     HP 700-101-O White 15" Perf     yds        0.00000         0.00000   
A6001-O15P     HP 700-101-O White 15" Perf     yds        0.00000         915.00000 

Я бы ожидал только 2 ряда, те, у которых 180 и 915.

Ответы [ 4 ]

1 голос
/ 17 сентября 2009

Так что в Центре всеобъемлющего контроля (8.70.014.000) нет плана объяснения или чего-либо, что выглядит как профилирование, поэтому я не могу говорить за пределами личного восприятия. Но для меня GROUP BY чувствует себя немного быстрее:

    SELECT t.code, 
           t.inv_description,
           t.bvstkuom,
           t.inv_committed,
           t.onhand,
           shh.in_date
      FROM "INVENTORY" t
INNER JOIN "SALES_HISTORY_DETAIL" shd ON shd.code = t.code
INNER JOIN "SALES_HISTORY_HEADER" shh ON shh.number = shd.number
  GROUP BY t.code, 
           t.inv_description,
           t.bvstkuom,
           t.inv_committed,
           t.onhand,
           shh.in_date

Помните, что Pervasive требует, чтобы вы включили все столбцы, в которых не выполняются агрегатные функции.

Версия с использованием DISTINCT:

    SELECT DISTINCT t.code, 
           t.inv_description,
           t.bvstkuom,
           t.inv_committed,
           t.onhand,
           shh.in_date
      FROM "INVENTORY" t
INNER JOIN "SALES_HISTORY_DETAIL" shd ON shd.code = t.code
INNER JOIN "SALES_HISTORY_HEADER" shh ON shh.number = shd.number

С какой версией BV / Pervasive вы имеете дело? Я могу протестировать против v6 / 2000i, если это будет необходимо.

1 голос
/ 17 сентября 2009

Я не знаю насчет Pervasive SQL, но обычно вам приходится группировать по всем столбцам, которые вы хотите сгруппировать, в данном случае это все столбцы (кроме "SALES_HISTORY_HEADER". "IN_DATE", что не соответствует желаемому выход)

SELECT "INVENTORY"."CODE", "INVENTORY"."INV_DESCRIPTION", 
"INVENTORY"."BVSTKUOM", "INVENTORY"."INV_COMMITTED", 
 "INVENTORY"."ONHAND"
FROM "INVENTORY" INNER JOIN "SALES_HISTORY_DETAIL" ON "SALES_HISTORY_DETAIL"."CODE" = "INVENTORY"."CODE" INNER JOIN "SALES_HISTORY_HEADER" ON "SALES_HISTORY_HEADER"."NUMBER" = "SALES_HISTORY_DETAIL"."NUMBER"
where "INVENTORY"."PROD" like 'A6O%' AND "SALES_HISTORY_HEADER"."IN_DATE" > '20090731'
group by "INVENTORY"."CODE", "INVENTORY"."INV_DESCRIPTION", 
"INVENTORY"."BVSTKUOM", "INVENTORY"."INV_COMMITTED", 
 "INVENTORY"."ONHAND"
0 голосов
/ 10 октября 2009

Что ж, получается, что проблема с дубликатами была в том, что я забыл отфильтровать склады. Я должен был добавить в предложении, где это:

ГДЕ "ИНВЕНТАРЬ". "WHSE" = '00'

Это решило проблему

0 голосов
/ 17 сентября 2009

Вы уверены, что не ищете SELECT DISTINCT, который возвращает одну строку, если есть дубликаты? Если вы исключите IN_DATE из вашего SELECT, я думаю, это то, что вы хотите.

SELECT DISTINCT "INVENTORY"."CODE", "INVENTORY"."INV_DESCRIPTION", 
"INVENTORY"."BVSTKUOM", "INVENTORY"."INV_COMMITTED", 
 "INVENTORY"."ONHAND"
FROM "INVENTORY" INNER JOIN "SALES_HISTORY_DETAIL" ON "SALES_HISTORY_DETAIL"."CODE" = "INVENTORY"."CODE" INNER JOIN "SALES_HISTORY_HEADER" ON "SALES_HISTORY_HEADER"."NUMBER" = "SALES_HISTORY_DETAIL"."NUMBER"
    where "INVENTORY"."PROD" like 'A6O%' AND "SALES_HISTORY_HEADER"."IN_DATE" > '20090731'
...