我在为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
我一直在研究这个问题已经有一段时间了,我无法弄明白。希望我已经提供了足够的信息,任何帮助将不胜感激。
答案 0 :(得分:2)
将此用于Completed
列,GROUP BY
其他列:
SUM(CASE Used WHEN 'Yes' THEN 1 ELSE 0 END) AS Completed