Confusão de function GROUP BY / aggregate em SQL

Eu preciso de um pouco de ajuda para endireitar alguma coisa, eu sei que é uma pergunta fácil muito fácil, mas é algo que está um pouco confuso em SQL.

Essa consulta SQL lança um erro ‘não é uma expressão GROUP BY’ no Oracle. Entendo porque, como sei que, depois de agrupar por um atributo de uma tupla, não consigo mais acessar nenhum outro atributo.

SELECT * FROM order_details GROUP BY order_no 

No entanto este aqui funciona

 SELECT SUM(order_price) FROM order_details GROUP BY order_no 

Apenas para concretizar meu entendimento sobre isso … Supondo que existam múltiplas tuplas em order_details para cada ordem que é feita, uma vez que eu agrupe as tuplas de acordo com order_no, eu ainda posso acessar o atributo order_price para cada tupla individual no grupo, mas apenas usando uma function agregada?

Em outras palavras, as funções agregadas quando usadas na cláusula SELECT são capazes de detalhar o grupo para ver os atributos ‘ocultos’, onde simplesmente usar ‘SELECT order_no’ gerará um erro?

Obrigado pela sua ajuda para esclarecer isso, tive dificuldade em encontrar uma resposta para esta pergunta específica no Google.

Chris

No SQL padrão (mas não no MySQL), quando você usa GROUP BY, você deve listar todas as colunas de resultado que não são agregadas na cláusula GROUP BY. Portanto, se order_details tiver 6 colunas, você deverá listar todas as 6 colunas (por nome – você não pode usar * nas cláusulas GROUP BY ou ORDER BY) na cláusula GROUP BY.

Você também pode fazer:

 SELECT order_no, SUM(order_price) FROM order_details GROUP BY order_no; 

Isso funcionará porque todas as colunas não agregadas estão listadas na cláusula GROUP BY.

Você poderia fazer algo como:

 SELECT order_no, order_price, MAX(order_item) FROM order_details GROUP BY order_no, order_price; 

Esta consulta não é realmente significativa (ou provavelmente não é significativa), mas irá “funcionar”. Ele listará cada combinação de preço de ordem e número de pedido separados e fornecerá o item de pedido máximo (número) associado a esse preço. Se todos os itens em um pedido tiverem preços distintos, você terminará com grupos de uma linha cada. OTOH, se houver vários itens no pedido com o mesmo preço (digamos, £ 0,99 cada), agrupá-los e retornar o número máximo do item do pedido a esse preço. (Eu estou assumindo que a tabela tem uma chave primária em (order_no, order_item) onde o primeiro item na ordem tem order_item = 1 , o segundo item é 2, etc.)

Para usar a cláusula group by, você deve mencionar todas as colunas da instrução select na cláusula group by, mas não a coluna da function agregada.

Para fazer isso em vez de agrupar por você pode usar a partição por cláusula você pode usar apenas uma porta para agrupar como uma partição por.

você também pode fazer isso como partição por 1

 SELECT * FROM order_details GROUP BY order_no 

Na consulta acima você está selecionando todas as colunas por causa disso está lançando um erro não agrupado por algo como .. para evitar que você tenha que mencionar todas as colunas, seja qual for na instrução select todas as colunas devem estar em group by clause ..

  SELECT * FROM order_details GROUP BY order_no,order_details,etc 

etc significa todas as colunas da tabela order_details.