Sql 具有条件的同一行上的多个计数

Sql 具有条件的同一行上的多个计数,sql,tsql,Sql,Tsql,我正在尝试计算表中数据的摘要视图,目前查询工作正常,但效率不是很高,因为我的表最终将持有10000多份合同。我还需要在同一日期对每个数据进行过滤,我意识到我可以在where语句中对每个计数进行过滤,但这不是很有效 另外,如果我可以在字段上操作而不是选择字段,那么最后的计算会容易得多 (SELECT COUNT (*) FROM Contracts WHERE contractWon = 1) Won, (SELECT COUNT (*) FROM Contracts WHERE contract

我正在尝试计算表中数据的摘要视图,目前查询工作正常,但效率不是很高,因为我的表最终将持有10000多份合同。我还需要在同一日期对每个数据进行过滤,我意识到我可以在where语句中对每个计数进行过滤,但这不是很有效

另外,如果我可以在字段上操作而不是选择字段,那么最后的计算会容易得多

(SELECT COUNT (*) FROM Contracts WHERE contractWon = 1) Won,
(SELECT COUNT (*) FROM Contracts WHERE contractPassedToCS = 1) PassedtoCS,
(SELECT COUNT (*) FROM Contracts WHERE contractPassedToCS = 0) as OutstandingWithSales,
(SELECT COUNT (*) FROM Contracts WHERE contractIssued = 1) as ContractsIssued,
(SELECT COUNT (*) FROM Contracts WHERE contractReturned = 1) as ContractsReturned,
(CONVERT(decimal, (SELECT COUNT (*) FROM Contracts WHERE contractReturned = 1)) /         CONVERT(decimal, (SELECT COUNT (*) FROM Contracts WHERE contractIssued = 1))) * 100 as '% Outstanding'
我知道可能需要一些加入,但我有点困惑

谢谢

SELECT
    SUM(contractWon) AS Won,
    SUM(contractPassedToCS ) AS PassedtoCS,
    SUM(1-contractPassedToCS) AS OutstandingWithSales,
    SUM(contractIssued) AS contractIssued ,
    SUM(contractReturned) AS contractReturned,
    100.0 * SUM(contractReturned) / SUM(contractIssued) AS '% Outstanding'
FROM
    Mytable
无法聚合的“位”数据类型的替代公式。如果列是int,那么上面的查询就可以工作

    --Either CAST first to a type that aggregates...
    SUM(CAST(contractWon AS int)) AS Won,

    -- .. or rely on COUNT ignores NULL values
    COUNT(CASE contractWon WHEN 1 THEN 1 ELSE NULL END) AS Won,

如果你对你(尽管很公平)的假设做出评论,认为这些列是用1/0表示的布尔值(OP没有说明),那么我会加1。抱歉,它们都是布尔值。