Выбор определенных записей из набора результатов в зависимости от значения - PullRequest
3 голосов
/ 09 августа 2011

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

BillingPeriod|ItemCode|ItemName|Charge|IsAdjustment|AdjustmentDate|ReportTimestamp

Я столкнулся с несколькими проблемами, которые мой текущий запрос обрабатывает довольно хорошо, я думаю. Поскольку в некоторых случаях код оплаты не встречается в таблице начислений, потому что мы не выставляли счета за него, но мне нужна единая таблица, отображающая каждый период расчета, поэтому я делаю фиктивную таблицу, заполненную периодами выставления счетов и нулями, и объедините его с результатами из таблицы «Сборы», например:

SELECT BillingPeriod, SumOfCharge AS Total FROM (
        SELECT BillingPeriod, 0 AS SumOfCharge
        FROM Charges
        UNION
        SELECT BillingPeriod, SUM(Charge) AS SumOfCharge
        FROM Charges
        WHERE (ItemCode Between 1900 and 1995)
        GROUP BY BillingPeriod
);

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

BillingPeriod|Charge
1/1/2011     |100.00
1/1/2011     |0
2/1/2011     |0
3/1/2011     |0
3/1/2011     |-23.00
4/1/2011     |0
5/1/2011     |0
6/1/2011     |0
7/1/2011     |0

Я пытаюсь избавиться от этих 0-значных строк и выбрать правильную для отображения в отчете. Единственная сложность в том, что значения могут быть положительными, отрицательными или нулевыми, поэтому простое выполнение MAX не сработает. Я также пытался FIRST () или LAST (), (COALESCE ()) не работает, у меня есть доступ). Любая помощь будет оценена.

Ответы [ 3 ]

4 голосов
/ 09 августа 2011

Просто суммируйте поле и группу SumOfCharge по BillingPeriod:

SELECT BillingPeriod, SUM(SumOfCharge) AS Total FROM (
    SELECT BillingPeriod, 0 AS SumOfCharge
    FROM Charges
    UNION
    SELECT BillingPeriod, SUM(Charge) AS SumOfCharge
    FROM Charges
    WHERE (ItemCode Between 1900 and 1995)
    GROUP BY BillingPeriod
) GROUP BY BillingPeriod;
1 голос
/ 09 августа 2011

Как насчет:

SELECT P.BillingPeriod, 
ISNULL(C.SumOfCharge,0) AS SumOfCharge
FROM (
    SELECT Distinct BillingPeriod
    FROM Charges) AS P
LEFT JOIN 
    (SELECT BillingPeriod, SUM(Charge) AS SumOfCharge
    FROM Charges
    WHERE (ItemCode Between 1900 and 1995)
    GROUP BY BillingPeriod) as C
ON P.BillingPeriod = C.BillingPeriod
ORDER BY P.BillingPeriod
0 голосов
/ 09 августа 2011

Хотелось бы что-то вроде этой работы:

SELECT C.BillingPeriod,
       ISNULL(C1.SumOfCharge, 0) AS Total
FROM Charges
LEFT OUTER JOIN (SELECT BillingPeriod, SUM(Charge) AS SumOfCharge
                 FROM Charges
                 WHERE (ItemCode Between 1900 and 1995)
                 GROUP BY BillingPeriod) C1 ON C.BillingPeriod = C1.BillingPeriod
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...