Erreur GROUP BY avec TOP dans T-SQL / SQL Server

J'ai cette table dans ma database SQL Server.

CREATE TABLE [dbo].[CODIFICHE_FARMACI] ( [Principio_Attivo] [nvarchar](250) NULL, [LanguageID] [nvarchar](50) NOT NULL, [Codice] [nvarchar](50) NOT NULL, [Confezione_rif] [nvarchar](1000) NULL, [ATC] [nvarchar](100) NULL, [Farmaco] [nvarchar](1000) NULL, [Confezione] [nvarchar](1000) NULL, [Ditta] [nvarchar](100) NULL, CONSTRAINT [PK_CODIFICHE_FARMACI] PRIMARY KEY CLUSTERED ([LanguageID] ASC, [Codice] ASC) ) 

Maintenant, je veux extraire de ce tableau le premier groupe de 60 loggings par colonne Farmaco .

J'ai donc écrit cette requête:

 SELECT TOP 60 * FROM CODIFICHE_FARMACI GROUP BY Farmaco 

Mais j'ai cette étrange erreur:

La colonna 'CODIFICHE_FARMACI.Principio_Attivo' n'est pas valida nell'elenco di selezione perché non inclus dans néa funzione di aggregazione nella clausola GROUP BY.

En anglais:

La colonne 'CODIFICHE_FARMACI.Principio_Attivo' n'est pas valide dans la list de sélection car elle n'est incluse ni dans une fonction d'agrégat ni dans la clause GROUP BY.

EDIT : avec cette requête, j'obtiens ce résultat

entrez la description de l'image ici

Comme vous pouvez le voir, j'ai répliqué la colonne Farmaco (Il y a deux fois ABBA, ABESART)

EDIT comme résultat je veux:

 |FARMACO| ABBA ABESART ABILIFY 

Si vous souhaitez sélectionner les 60 Farmaco valeurs de Farmaco tout en affichant uniquement des valeurs distinctes, vous pouvez essayer d'utiliser SELECT DISTINCT :

 SELECT DISTINCT TOP 60 Farmaco FROM [dbo].[CODIFICHE_FARMACI] ORDER BY Farmaco 

Notez que si vous avez vraiment des loggings qui sont en double, cela implique que vos données ne sont pas normalisées. Eventuellement, les duplicates sont les mêmes pour certaines colonnes, mais pas pour d'autres.

 SELECT TOP 60 cf.Farmaco FROM CODIFICHE_FARMACI AS cf GROUP BY cf.Farmaco ORDER BY cf.Farmaco 

Lorsque vous utilisez GROUP BY, vous obtenez une valeur distincte de la ou des colonnes suivie de GROUP BY (dans votre cas, Farmaco).

D'abord l'instruction FROM va être exécutée, ensuite l'set de données extrait avec l'alias cf de CODIFICHE_FARMACI va être regroupé par cf.Farmaco.

La command SELECT récupérera uniquement les valeurs de la colonne cf.Farmaco, avec ORDER BY elles seront ordonnées en ordre croissant (parce que ORDER BY expression, a un ordre croissant par défaut). À la fin, TOP 60 ne filter que 60 ROWS du jeu de données.

Lorsque vous spécifiez SELECT * et que vous avez la clause GROUP BY, vous rencontrez un problème, car chaque colonne écrite dans GROUP BY doit se find dans l'instruction SELECT.

Vous pouvez également append des colonnes résultant de fonctions d'agrégation telles que SUM, MIN, MAX et etc. à l'instruction SELECT.

Essaye ça:

 SELECT Top 60 a.Farmaco FROM [dbo].[CODIFICHE_FARMACI] A GROUP BY A.Farmaco