2015-12-18 4 views
0

У меня возникла проблема при создании правильного запроса для SQL Server. Чтобы начать, вот данные, которые я пытаюсь выполнить.Число столбцов SQL Server, не содержащихся в агрегированной функции

TicketBookNum | TicketNum | Used | DateIssued | UnitID 
--------------------------------------------- 
1234   | 25  | Yes | Dec 18 2015 | 101 
----------------------------------------------  
1234   | 26  | Yes | Dec 18 2015 | 101 
----------------------------------------------   
1234   | 27  | Yes | Dec 18 2015 | 101 
----------------------------------------------  
1234   | 28  | No | Dec 18 2015 | 101 
----------------------------------------------  
1235   | 70  | Yes | Dec 10 2015 | 102 
----------------------------------------------  
1235   | 71  | Yes | Dec 10 2015 | 102  
----------------------------------------------   
1235   | 72  | No | Dec 10 2015 | 102  
----------------------------------------------  
1235   | 73  | No | Dec 10 2015 | 102 
----------------------------------------------  

Прошу эти данные ввести в список. TicketBookNum и TicketNum являются основным ключом. Запросом я использую для извлечения данных является функцией поиска, и именно это:

create procedure [dbo].[SearchTicketBooks] 
@TicketBookNumber nvarchar(10) = null, 
@DateIssuedA  datetime = null, 
@DateIssuedB  datetime = null, 
@UnitID   nvarchar(10) = null 
as 
select distinct(TicketBookNum), DateIssued, U.UnitID, COUNT(Used) as 'Completed' --Error on this COUNT because there is no aggregate function 
    from TicketBooks TB 
    full outer join Units U 
    on TB.UnitID=U.UnitID 
where TicketBookNum = 
    (case when @TicketBookNumber is null or @TicketBookNumber = '' then TicketBookNum else @TicketBookNumber end) 
and TB.UnitID = 
    (case when @UnitID is null or @UnitID = '' then TB.UnitID else @UnitID end) 
and DateIssued = 
    (case when (@DateIssuedA is null and @DateIssuedB is null) or (@DateIssuedA = '' and @DateIssuedB = '') or 
    @DateIssuedB = @DateIssuedA or DateIssued between @DateIssuedA and @DateIssuedB then DateIssued else @DateIssuedA end) 
order by DateIssued desc  
go 

Так что этот запрос делает позволяет пользователю искать для книг билетов, выбрав диапазон дат, блок, или поиск прямой номер путевки. Если в этих критериях поиска ничего не выбрано, он возвращает все значения.

Я пытаюсь вернуть счетчик для столбца Используется там, где он равен Да, и только для этой книги билетов. Таким образом, желаемый результат для каких-либо критериев поиска будет:

TicketBookNum | DateIssued | UnitID | Completed 
----------------------------------------------- 
1234   | Dec 18 2015| 101 | 3 
1235   | Dec 10 2015| 102 | 2 

Я работал над этим в течение довольно долгое время, и я не могу понять это. Надеюсь, я предоставил достаточно информации, и любая помощь будет принята с благодарностью.

ответ

2

Используйте это для Completed колонки и GROUP BY другие колонки:

SUM(CASE Used WHEN 'Yes' THEN 1 ELSE 0 END) AS Completed 
+0

К сожалению, я несколько из новичка в SQL. Нужно ли мне группировать все остальные столбцы или просто TicketBookNum? Не группировали ли данные, не упорядоченные по дате? –

+0

Вы будете группировать ВСЕ другие столбцы в списке выбора (но не все столбцы в таблице). Вы по-прежнему можете заказывать по дате или любой другой столбец в списке выбора. Ох, и вы можете удалить DISTINCT из списка выбора, так как Group By выполняет ту же функцию. –

+0

Хорошо, я попробую. Спасибо за помощь! –

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