У меня возникла проблема при создании правильного запроса для 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
Я работал над этим в течение довольно долгое время, и я не могу понять это. Надеюсь, я предоставил достаточно информации, и любая помощь будет принята с благодарностью.
К сожалению, я несколько из новичка в SQL. Нужно ли мне группировать все остальные столбцы или просто TicketBookNum? Не группировали ли данные, не упорядоченные по дате? –
Вы будете группировать ВСЕ другие столбцы в списке выбора (но не все столбцы в таблице). Вы по-прежнему можете заказывать по дате или любой другой столбец в списке выбора. Ох, и вы можете удалить DISTINCT из списка выбора, так как Group By выполняет ту же функцию. –
Хорошо, я попробую. Спасибо за помощь! –