2016-06-08 1 views
-1

Итак, я использую СУБД PostgreSQL и у меня есть следующий запрос:Как я могу показать все результаты в случае ничьей в Postgres?

Select "CustomerID",Sum("TotalDue") as Total 
from "Bike Business"."SalesOrderHeader" 
group by "CustomerID" 
order by Total desc limit 1; 

Этот запрос выводит идентификатор человека с максимальной стоимости заказов и количества максимальной стоимости. Но в случае ничьей, где 2 или более человек имеют одинаковую максимальную стоимость заказов, я хочу, чтобы запрос печатал их идентификаторы и максимальную стоимость. Как я могу это сделать?

+0

Несвязанный, но: вы должны действительно избегать цитируемых идентификаторов. В долгосрочной перспективе они намного сложнее, чем они того стоят. –

+0

Ой, не знал, что ... Как я могу использовать идентификаторы? Причина postgre продолжает давать мне ошибки, когда я использую идентификаторы без кавычек. – NikosLardas

+0

Никогда не используйте двойные кавычки. Не используйте их при создании таблиц, поэтому вам не нужно использовать их позже (и это Postgres, а не Postgre). –

ответ

0

Вы можете использовать функции окна для этого:

select "CustomerID", total 
from (
    Select "CustomerID", 
      Sum("TotalDue") as Total, 
      dense_rank() over (order by Sum("TotalDue") desc) as rnk 
    from "Bike Business"."SalesOrderHeader" 
    group by "CustomerID" 
) t 
where rnk = 1; 

Это, вероятно, будет быстрее, чем эквивалентный запрос с помощью подвыборки или производной таблицы.

И у этого есть дополнительное преимущество, которое вы можете легко получить 2-го или 3-го наивысшего значения.

0

В принципе, вы ищете 1 или более клиентов, у которых самая высокая общая сумма.

WITH customer_total AS 
(
SELECT 
    CustomerID, 
    SUM(TotalDue) as Total 
FROM 
    "Bike Business".SalesOrderHeader 
GROUP BY 
    CustomerID 
) 

SELECT 
    CustomerID, 
    Total 
FROM 
    customer_total 
WHERE 
    Total = (SELECT MAX(Total) FROM customer_total); 
0

В этом случае определить максимальную причитающуюся сумму в подзапрос и присоединиться к нему на ваш запрос без ограничения:

Select CustomerID,Sum(TotalDue) as Total 
from "Bike Business"."SalesOrderHeader" 
join 
    (Select Sum(TotalDue) as MaxTotal 
    from "Bike Business"."SalesOrderHeader" 
    group by CustomerID 
    order by Total desc 
    limit 1) t1 
group by CustomerID 
having Total=t1.MaxTotal 
+0

Спасибо, человек, но как я могу присоединиться к нему? Как правильно писать это в sql-коде Postgre? – NikosLardas

+0

@NikosLardas, так как большая часть моего ответа - это реальный sql-запрос, я полностью в недоумении относительно того, как интерпретировать ваш вопрос ... – Shadow

+0

Я нашел его, все в порядке, спасибо! – NikosLardas

0

Вы можете использовать подзапросы

SELECT CustomerID,su FROM ( 
       SELECT CustomerID,sum(val) as su FROM 
       "Bike Business"."SalesOrderHeader" GROUP By CustomerID) tmp2 
     WHERE su =(SELECT max(tmp.su) FROM( 
       SELECT CustomerID,sum(val) as su FROM 
       "Bike Business"."SalesOrderHeader" GROUP By CustomerID)tmp);