2013-06-03 24 views
3

我有这样的代码:有什么方法可以通过文本列进行分组吗?

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

但它给我这个错误:

Column MRD_DOCUMENT_HEADER.TERMINAL_DESCRIPTION is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause.

我试图VARCHAR(100)MAX但也不能工作。

我该如何得到这个工作?


更新

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 
WHERE 
     MRD_DOCUMENT_HEADER.DOCUMENT_TYPE_DESCRIPTION = (@DOCUMENT_TYPE_DESCRIPTION) 
    OR MRD_DOCUMENT_HEADER.DOCUMENT_DATE = (@DOCUMENT_DATE) 
    OR MRD_DOCUMENT_HEADER.PAYMENT_LIMIT_DATE =(@PAYMENT_LIMIT_DATE) 
    OR MRD_DOCUMENT_HEADER.CORPORATION_ID = (@CORPORATION_ID) 

回答

0

尝试这一个 -

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 

更新为最后的评论:

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 

更新2最后的评论:

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 
+0

我真的很喜欢这个解决方案,我只是不想重复OPERATOR_NAME(对不起之前不提) –

+0

@Devart它有很多行数据。例如,OPERATOR_NAME的Name_LastName重复了很多次。但我想这是不可能的,因为每个人都与DOCUMENT_DATE有联系,并且这个专栏对每个OPERATOR_NAME都有不同的值。 –

+1

认为SQL Server是一种使用SELECT来提取所需数据的工具。然后,您决定如何使用报告构建器显示数据。 – tezzo

0

你必须把那些列在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 
+0

对不起,我有点新东西,顺便说一句,非常感谢快速响应!你能给我举个例子吗? (: –

+0

每当你使用某些东西进行分组时,无论在select语句中有哪些列名,通常它们都被包含在group by子句中,只要看看上面的查询,我已经纠正了它。问题,请让我知道.. :) –

0

如果您在SQL中使用GROUP BY条款,那么在SELECT列表中,您只能使用GROUP BY中使用的相同的列以及任何其他列必须是包裹在聚合函数中,如count(),min(),max(),avg()等。

这是SQL92/SQL99的要求。但是,一些SQL引擎非常宽容,例如MySQL和SQLite允许打破这个规则。但MS SQL Server,Oracle和PostgreSQL相当严格。

0

在此SELECT中似乎只有字母数字值,因此您可以设置ORDER BY OPERATOR_NAME。

GROUP BY语句与聚合函数结合使用,可以将结果集按一列或多列(MIN,MAX,COUNT)分组。

相关问题