2015-09-11 3 views
-1

У меня возникли проблемы с фильтрацией повторяющихся значений столбцов.Sql Server 2008 Выбор отличия

Вот мои результаты, до сих пор:

ProjectNumber, WorkOrder, Shipment, Start, End, Quantity, PartName 
------------------------------------------------------------------ 
1234 | 1234-01 | S-01 | 2015-09-01 00:00:01 | 2015-09-01 00:00:01 | 200 | Part A 
1234 | 1234-02 | S-01 | 2015-09-01 00:00:01 | 2015-09-01 00:00:01 | 200 | Part B 
1234 | 1234-03 | S-01 | 2015-09-01 00:00:01 | 2015-09-01 00:00:01 | 200 | Part C 
2345 | 2345-01 | S-01 | 2015-09-02 00:00:01 | 2015-09-02 00:00:01 | 12 | Part A 
2345 | 2345-02 | S-01 | 2015-09-02 00:00:01 | 2015-09-02 00:00:01 | 24 | Part B 

Я знаю, что нужно группе ProjectNumber, с данными первого WorkOrder в, если это имеет смысл. Таким образом, желаемым результатом будет:

ProjectNumber, WorkOrder, Shipment, Start, End, Quantity, PartName 
------------------------------------------------------------------ 
1234 | 1234-01 | S-01 | 2015-09-01 00:00:01 | 2015-09-01 00:00:01 | 200 | Part A 
2345 | 2345-01 | S-01 | 2015-09-02 00:00:01 | 2015-09-02 00:00:01 | 12 | Part A 

То, что я пробовал до сих пор, без кубиков.

SELECT 
    ProjectNumber, ProductionNotes AS Shipment, PromiseDate AS "End", Notes, 
    MIN(WorkOrderNumber) AS "Work Order", Name AS "Sales Order", PromiseDate, 
    Quantity, PartName 
FROM Database.dbo.daWorkOrders 
WHERE StatusTypeID = 3 
GROUP BY ProjectNumber 
ORDER BY PromiseDate ASC; 

Ответ:

Колонка «Database.dbo.daWorkOrders.ProductionNotes» недопустим в списке выбора, поскольку он не содержится ни совокупного функции или предложения GROUP BY.

Возможно ли это?

ответ

0

В основном, эта ошибка говорит о том, что если вы собираетесь использовать предложение GROUP BY, тогда ваш результат будет отношением/таблицей со строкой для каждой группы, поэтому в вашем заявлении SELECT вы можете только " выберите «столбец, который вы группируете, и используйте агрегатные функции в этом столбце, потому что другие столбцы не будут отображаться в результирующей таблице.

Пожалуйста, попробуйте использовать этот запрос:

SELECT ProjectNumber 
,  ProductionNotes AS Shipment 
,  PromiseDate AS "End" 
,  Notes 
,  MIN(WorkOrderNumber) AS "Work Order" 
,  Name AS "Sales Order" 
,  PromiseDate 
,  Quantity 
,  PartName 
FROM Database.dbo.daWorkOrders 
WHERE StatusTypeID = 3 
GROUP BY ProjectNumber, ProductionNotes, PromiseDate, Note, Name, PromiseDate, Quantity, PartName 
ORDER BY PromiseDate ASC; 
+0

Я получаю этот ответ: 'Тип текста, ntext и изображения не могут сравниваться или сортироваться, кроме случаев, когда используется оператор NULL или LIKE. – visevo

+1

Имеет смысл. Я просто удалю лишние строки программно. Спасибо – visevo

+0

Пожалуйста, смотрите [здесь] (http://stackoverflow.com/q/14979413/4275342) – Marusyk

0

Я хотел бы использовать функцию row_number() окна с пунктом разделения: over (partition by [ProjectNumber] order by [WorkOrderNumber]) и фильтр для строк числа = 1 в каждом разделе:

with cte as (
    select 
     rn = row_number() over (partition by [ProjectNumber] order by [WorkOrderNumber]) 
     , * 
    from Database.dbo.daWorkOrders 
) 
select * from cte 
where rn = 1; 

Этот даст вам первый WorkOrder для каждого ProjectNumber:

rn ProjectNumber WorkOrder Shipment Start End Quantity PartName 
1 1234 1234-01 S-01 2015-09-01 00:00:01 2015-09-01 00:00:01 200 Part A 
1 2345 2345-01 S-01 2015-09-02 00:00:01 2015-09-02 00:00:01 12 Part A 

Если столбец WorkOrder имеет text типа вы можете бросить его в VARCHAR, чтобы получить раздел для работы:

row_number() over (partition by [ProjectNumber] order by cast([WorkOrder] as varchar(20))) 

(20 не может быть правильный размер, корректировать по мере необходимости).