Sql 有没有办法按文本列分组?
我有以下代码:Sql 有没有办法按文本列分组?,sql,sql-server,tsql,Sql,Sql Server,Tsql,我有以下代码: select CAST(OPERATOR_NAME AS NVARCHAR(MAX)) as 'Utilizador', TERMINAL_DESCRIPTION as 'Terminal', DOCUMENT_DATE as 'Data de Inicio', PAYMENT_LIMIT_DATE as 'Data de Fim', ORIGIN_WAREHOUSE_NAME as 'Loja', DOCUMENT_TYPE_DESCRIPTION as 'Tipos de D
select CAST(OPERATOR_NAME AS NVARCHAR(MAX)) as 'Utilizador',
TERMINAL_DESCRIPTION as 'Terminal',
DOCUMENT_DATE as 'Data de Inicio',
PAYMENT_LIMIT_DATE as 'Data de Fim',
ORIGIN_WAREHOUSE_NAME as 'Loja',
DOCUMENT_TYPE_DESCRIPTION as 'Tipos de Documentos'
from MRD_DOCUMENT_HEADER
GROUP BY CAST(OPERATOR_NAME AS NVARCHAR(MAX))
但它给了我一个错误:
列MRD\u DOCUMENT\u HEADER。TERMINAL\u DESCRIPTION
在选择列表中无效,因为它不包含在聚合函数或GROUP BY
子句中
我尝试了VARCHAR(100)
和MAX
,但也没有成功
我怎样才能让它工作
更新
您必须将这些列放入
GROUP BY
子句中。它会解决你的问题。只需使用以下代码:
select CAST(OPERATOR_NAME AS NVARCHAR(MAX)) as 'Utilizador',
TERMINAL_DESCRIPTION as 'Terminal',
DOCUMENT_DATE as 'Data de Inicio',
PAYMENT_LIMIT_DATE as 'Data de Fim',
ORIGIN_WAREHOUSE_NAME as 'Loja',
DOCUMENT_TYPE_DESCRIPTION as 'Tipos de Documentos'
from MRD_DOCUMENT_HEADER
GROUP BY
CAST(OPERATOR_NAME AS NVARCHAR(MAX)),
TERMINAL_DESCRIPTION, DOCUMENT_DATE,
PAYMENT_LIMIT_DATE,
ORIGIN_WAREHOUSE_NAME,
DOCUMENT_TYPE_DESCRIPTION
试试这个-
SELECT
Utilizador = OPERATOR_NAME
, Terminal = TERMINAL_DESCRIPTION
, [Data de Inicio] = DOCUMENT_DATE
, [Data de Fim] = PAYMENT_LIMIT_DATE
, Loja = ORIGIN_WAREHOUSE_NAME
, [Tipos de Documentos] = DOCUMENT_TYPE_DESCRIPTION
FROM dbo.MRD_DOCUMENT_HEADER
GROUP BY
OPERATOR_NAME
, TERMINAL_DESCRIPTION
, DOCUMENT_DATE
, PAYMENT_LIMIT_DATE
, ORIGIN_WAREHOUSE_NAME
, DOCUMENT_TYPE_DESCRIPTION
DOCUMENT_TYPE_DESCRIPTION
或者尝试更优雅的样品-
SELECT DISTINCT
Utilizador = OPERATOR_NAME
, Terminal = TERMINAL_DESCRIPTION
, [Data de Inicio] = DOCUMENT_DATE
, [Data de Fim] = PAYMENT_LIMIT_DATE
, Loja = ORIGIN_WAREHOUSE_NAME
, [Tipos de Documentos] = DOCUMENT_TYPE_DESCRIPTION
FROM dbo.MRD_DOCUMENT_HEADER
最新评论:
更新2以获取最后评论:
如果您在SQL中使用了
GROUP BY
子句,那么在选择列表中,您只能使用GROUP BY
中使用的相同列,并且任何其他列必须包装在聚合函数中,如count()
,min()
,max()
,avg()
,等等
这是SQL92/SQL99的要求。然而,一些SQL引擎非常宽容,例如MySQL和SQLite允许打破这一规则。但是MS SQL Server、Oracle和PostgreSQL非常严格。在这个选择中,似乎只有字母数字值,所以您可以按操作员名称设置顺序
GROUP BY语句与聚合函数一起使用,将结果集按一列或多列(最小、最大、计数)进行分组。很抱歉,我对这类内容有点陌生,顺便说一句,非常感谢您的快速响应!你能给我举个例子吗?(:请参阅每当您使用某个内容进行分组时,无论select语句中的列名是什么,通常都会将它们包含在group by子句中。请查看上面的查询,我已经更正了它。如果您遇到任何问题,请务必让我知道……)我非常喜欢此解决方案,我只想重复运算符的名称(很抱歉之前没有提及)@Devart它有很多行的数据。例如,OPERATOR_NAME让NAME_LastName重复了很多次。但我想这是不可能的,因为每一行都与DOCUMENT_DATE有联系,并且每个OPERATOR_NAME的值都不同。将SQL Server作为一个工具来使用SELECT提取您需要的数据。然后,您决定如何显示yo使用报表生成器生成ur数据。@我使用metod SELECT(在上面的示例中)在表上显示我的数据。然后我创建了一个过滤器(我在上面更新了)在MS SQL中RB@Devart是的,我很抱歉没有提供那么多关于它的信息,但我真正想要的是你给我的第一个代码,所以它真的很有用!我在MS SQL Server RB上试用了一下,它成功了^^。
SELECT DISTINCT
Utilizador = OPERATOR_NAME
, Terminal = TERMINAL_DESCRIPTION
, [Data de Inicio] = DOCUMENT_DATE
, [Data de Fim] = PAYMENT_LIMIT_DATE
, Loja = ORIGIN_WAREHOUSE_NAME
, [Tipos de Documentos] = DOCUMENT_TYPE_DESCRIPTION
FROM dbo.MRD_DOCUMENT_HEADER
SELECT
Utilizador = OPERATOR_NAME
, Terminal = MAX(TERMINAL_DESCRIPTION)
, [Data de Inicio] = MAX(DOCUMENT_DATE)
, [Data de Fim] = MAX(PAYMENT_LIMIT_DATE)
, Loja = MAX(ORIGIN_WAREHOUSE_NAME)
, [Tipos de Documentos] = MAX(DOCUMENT_TYPE_DESCRIPTION)
FROM dbo.MRD_DOCUMENT_HEADER
GROUP BY OPERATOR_NAME
SELECT DISTINCT
Utilizador = OPERATOR_NAME
, Terminal = TERMINAL_DESCRIPTION
, [Data de Inicio] = CONVERT(VARCHAR(10), DOCUMENT_DATE, 120)
, [Data de Fim] = PAYMENT_LIMIT_DATE
, Loja = ORIGIN_WAREHOUSE_NAME
, [Tipos de Documentos] = DOCUMENT_TYPE_DESCRIPTION
FROM dbo.MRD_DOCUMENT_HEADER t
WHERE t.DOCUMENT_TYPE_DESCRIPTION = @DOCUMENT_TYPE_DESCRIPTION
OR t.DOCUMENT_DATE = @DOCUMENT_DATE
OR t.PAYMENT_LIMIT_DATE = @PAYMENT_LIMIT_DATE
OR t.CORPORATION_ID = @CORPORATION_ID