2013-06-03 2 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 

Update 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

Если вы используете GROUP BY пункт в вашем SQL, то в списке ЗЕЬЕСТ Вы можете использовать только те же столбцы, которые были использованы в 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).

Смежные вопросы