2013-06-03 25 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)分組。

相關問題