Несколько рассчитывает на одну строку с условиями - PullRequest
4 голосов
/ 10 декабря 2010

Я пытаюсь вычислить суммарное представление данных в моей таблице, в данный момент запрос работает, но это не очень эффективно, поскольку моя таблица в конечном итоге будет содержать более 10 000 контрактов. Мне также нужно отфильтровать каждое из них к одной и той же дате, я понимаю, что могу сделать это в операторе 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'

Я понимаю, что, возможно, нужно какое-то присоединение, но я немного растерялся.

Спасибо.

1 Ответ

4 голосов
/ 10 декабря 2010
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,
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...