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

但它给了我这个错误:

选择列表中的列MRD_DOCUMENT_HEADER.TERMINAL_DESCRIPTION无效,因为它既不包含在聚合函数中,也不包含在GROUP BY子句中。

我试过了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)
4

4 回答 4

0

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

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

于 2013-06-03T08:56:34.007 回答
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
于 2013-06-03T08:49:21.920 回答
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
于 2013-06-03T08:51:31.097 回答
0

如果您GROUP BY在 SQL 中使用子句,那么在 SELECT 列表中您只能使用在 中使用的相同列GROUP BY,并且任何其他列必须包含在聚合函数中,如count(), min(), max(),avg()等。

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

于 2013-06-03T08:51:35.913 回答