T-SQL/SQL Server中的GROUP BY错误

问题描述:

我在我的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

如果您要选择的第一个60个Farmaco值,而只显示不同值,你可以尝试使用SELECT DISTINCT

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

请注意,如果你真的有记录rds是重复的,这意味着你的数据没有被标准化。可能的情况是,只有某些列的副本相同,但其他列不相同。

+0

向我们展示您实际需要的输出。请注意,这些记录对在所有列中都不相同。 –

试试这个:

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

尽管此代码可能回答此问题,但提供有关如何解决问题和/或为何解决问题的其他上下文将提高​​答案的长期价值。 –

+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