2017-02-04 2 views
1

Ich habe diese Tabelle in meiner SQL Server-Datenbank.GROUP BY Fehler mit TOP in T-SQL/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) 
) 

Jetzt möchte ich aus dieser Tabelle durch Farmaco Spalte die ersten 60 Datensatzgruppe extrahieren.

Also schrieb ich diese Anfrage:

SELECT TOP 60 * 
FROM CODIFICHE_FARMACI 
GROUP BY Farmaco 

Aber ich habe diesen seltsamen Fehler:

La colonna 'CODIFICHE_FARMACI.Principio_Attivo' non è valida nell'elenco di selezione perché non è inclusa né in una funzione di aggregazione né nella clausola GROUP BY.

In Englisch:

The column 'CODIFICHE_FARMACI.Principio_Attivo' is invalid in the select list because it is not included in either an aggregate function or the GROUP BY clause.

EDIT: mit dieser Abfrage, ich Erhalten Sie dieses Ergebnis

enter image description here

Wie man sehen kann ich replizieren die Spalte Farmaco (Es gibt zwei mal ABBA, ABESART)

EDIT as result I want :

|FARMACO| 
ABBA 
ABESART 
ABILIFY 
+1

Können Sie uns Beispieleingabe und -ausgabe zeigen? –

+1

Alle Ihre Spalten sind nvarchar. Gruppieren nach einem Feld bedeutet, dass Sie eindeutige Werte dieses Felds und einen Summenwert für andere Felder (Summe, Durchschnitt, Minimum, Maximum) erhalten möchten. Welchen Aggregatwert möchten Sie von Nvarchar-Feldern erhalten? – ventik

Antwort

3

Wenn Sie die ersten 60 Farmaco Werte auszuwählen, während nur deutliche zeigt Werte, können Sie versuchen SELECT DISTINCT mit:

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

Beachten Sie, dass, wenn Sie wirklich reco haben Rds, die doppelt sind, bedeutet, dass Ihre Daten nicht normalisiert sind. Möglicherweise sind die Duplikate nur in Bezug auf bestimmte Spalten gleich, aber nicht in anderen.

+0

Zeigen Sie uns, welche Ausgabe Sie eigentlich wollen. Beachten Sie, dass diese Datensatzpaare nicht in allen Spalten identisch sind. –

0

Try this:

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

Während dieser Code die Frage beantworten kann, würde das Bereitstellen eines zusätzlichen Kontextes hinsichtlich dessen, wie und/oder warum er das Problem löst, den langfristigen Wert der Antwort verbessern. –

+0

Während Sie das Problem dieses Benutzers gelöst haben, sind Code-Only-Antworten für Benutzer, die in Zukunft auf diese Frage kommen, nicht sehr hilfreich. Bitte bearbeiten Sie Ihre Antwort, um zu erklären, warum Ihr Code das ursprüngliche Problem löst. –

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

Wenn Sie GROUP BY benutzen, werden Sie eine deutliche Werte aus der Spalte/s erhalten durch GROUP BY (in Ihrem Fall Farmaco) gefolgt.

Zuerst wird die FROM-Anweisung ausgeführt, dann wird der abgerufene Datensatz mit dem Alias ​​cf von CODIFICHE_FARMACI nach cf.Farmaco gruppiert.

Der SELECT-Befehl ruft nur cf.Farmaco-Spaltenwerte ab, bei ORDER BY werden sie aufsteigend sortiert (da ORDER BY-Ausdruck standardmäßig eine aufsteigende Reihenfolge hat). Am Ende filtert TOP 60 nur 60 Zeilen aus dem Datensatz.

Wenn Sie SELECT * angeben und Sie GROUP BY-Klausel haben, haben Sie ein Problem, weil jede in GROUP BY geschriebene Spalte an der SELECT-Anweisung sein muss.

Sie können auch Spalten, die ein Ergebnis von Aggregatfunktionen wie SUM, MIN, MAX usw. sind, der SELECT-Anweisung hinzufügen.

+0

Verwenden Sie bitte die Zeichen zum Markieren von Inline-Code-Elementen, um Ihren Code noch lesbarer zu machen. Vielen Dank! – Kie