2017-02-04 106 views
1

我在我的SQL Server數據庫中有這個表。T-SQL/SQL Server中的GROUP BY錯誤

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) 
) 

現在我想從這張表中提取第一個60個記錄組Farmaco列。

所以我寫了這個查詢:

SELECT TOP 60 * 
FROM CODIFICHE_FARMACI 
GROUP BY Farmaco 

但是我有這個奇怪的錯誤:

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.

英文:

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.

編輯:此查詢,我得到這個結果

enter image description here

正如你可以看到我有複製列Farmaco(有兩次ABBA,ABESART)

EDIT as result I want :

|FARMACO| 
ABBA 
ABESART 
ABILIFY 
+1

你能告訴我們樣品的輸入和輸出嗎? –

+1

所有列都是nvarchar。按某個字段進行分組意味着您要接收該字段的不同值以及其他字段的某個合計值(總和,平均值,最小值,最大值)。您希望獲得nvarchar字段的什麼總值? – ventik

回答

3

如果您要選擇的第一個60個Farmaco值,而只顯示不同值,你可以嘗試使用SELECT DISTINCT

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

請注意,如果你真的有記錄rds是重複的,這意味着你的數據沒有被標準化。可能的情況是,只有某些列的副本相同,但其他列不相同。

+0

向我們展示您實際需要的輸出。請注意,這些記錄對在所有列中都不相同。 –

0

試試這個:

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

儘管此代碼可能回答此問題,但提供有關如何解決問題和/或爲何解決問題的其他上下文將提高​​答案的長期價值。 –

+0

儘管您可能已經解決了此用戶的問題,但僅有代碼的答案對於未來出現此問題的用戶來說並不是非常有用。請編輯您的答案,以解釋爲什麼您的代碼可以解決原始問題。 –

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

當您使用GROUP BY,你會從列得到不同的值緊隨其後是GROUP BY(在你的情況Farmaco)/。

首先執行FROM語句,然後檢索到的數據集現在用來自CODIFICHE_FARMACI的別名cf將被cf.Farmaco分組。

SELECT命令將只檢索cf.Farmaco列值,使用ORDER BY它們將按升序排列(因爲ORDER BY表達式具有默認的升序排序)。在結束時,TOP 60將只從數據集中篩選出60個ROWS。

當您指定SELECT *並且您有GROUP BY子句時,您將遇到問題,因爲在GROUP BY中編寫的每個列都必須位於SELECT語句中。

您還可以將聚合函數(如SUM,MIN,MAX等)的結果添加到SELECT語句中。

+0

請使用\'符號來標記'內嵌代碼'元素,使您的代碼更具可讀性。謝謝! – Kie