Добавление столбцов в SQL SELECT - PullRequest
1 голос
/ 28 сентября 2011

У меня есть следующий SQL sp, и я хотел бы добавить столбец «NetSales», который просто «GrossSales» - «Credits». Есть ли способ сделать это в том же операторе SELECT?

SELECT p.PerceptionistID, p.BaseCommission, p.BonusCommission, h.WeekOf, h.WorkHours, h.PTOHours, h.HolidayHours,
    ROUND(h.WorkHours, 0) AS HoursRounded, 
    (
        SELECT COUNT(c.PerceptionistID)
        FROM T_Call c 
        WHERE 
            c.PerceptionistID = p.PerceptionistID 
            AND c.OutcomeID = @OutcomeSale 
            AND EnteredOn BETWEEN @WeekOf AND DATEADD(dd, 7, @WeekOf)
    ) AS GrossSales,
    (
        SELECT COUNT (c.PerceptionistID)
        FROM T_CallCredit cc
            FULL JOIN T_Call c
                ON cc.CallID = c.CallID
        WHERE 
            c.PerceptionistID = p.PerceptionistID 
            AND cc.CallCreditStatusID NOT IN (17, 18)  -- 17 - 'Error in Customer Account', 18 - 'Courtesy Credit'
            AND cc.EnteredOn BETWEEN @WeekOf AND DATEADD(dd, 7, @WeekOf)
    ) AS Credits

    --------------------------------------------------
    -- would like to have something like the following

    SUM(GrossSales - Credits) AS NetSales


FROM T_Perceptionist p
    FULL JOIN T_PerceptionistHours h
        ON p.PerceptionistID = h.PerceptionistID
WHERE h.WeekOf = @WeekOf

TIA, Брайан

Ответы [ 4 ]

6 голосов
/ 28 сентября 2011

Оберните весь запрос следующим:

select *, a.GrossSales - a.Credits as NetSales
from (
    --your query here
) a
1 голос
/ 28 сентября 2011

Если вы не хотите вкладывать запросы и хотите иметь только один SELECT, вы должны добавить еще один столбец в список столбцов (обратите внимание, что это фактически копирование и вставка столбцов GrossSales и Credits со знаком вычитания между ними) :

(
    SELECT COUNT(c.PerceptionistID)
    FROM T_Call c 
    WHERE 
        c.PerceptionistID = p.PerceptionistID 
        AND c.OutcomeID = @OutcomeSale 
        AND EnteredOn BETWEEN @WeekOf AND DATEADD(dd, 7, @WeekOf)
) -
(
    SELECT COUNT (c.PerceptionistID)
    FROM T_CallCredit cc
        FULL JOIN T_Call c
            ON cc.CallID = c.CallID
    WHERE 
        c.PerceptionistID = p.PerceptionistID 
        AND cc.CallCreditStatusID NOT IN (17, 18)  -- 17 - 'Error in Customer Account', 18 - 'Courtesy Credit'
        AND cc.EnteredOn BETWEEN @WeekOf AND DATEADD(dd, 7, @WeekOf)
) AS Net

Однако я бы предпочел вложенные запросы, как предложил RedFilter.

0 голосов
/ 28 сентября 2011

Обычно вы просто пишете 'a - b'.Здесь они являются довольно ужасными выражениями, поэтому вы используете «подзапрос в предложении FROM»:

SELECT PerceptionistID, BaseCommission, BonusCommission, WeekOf, WorkHours, PTOHours,
       HolidayHours, HoursRounded, GrossSales, Credits, (GrossSales - Credits) AS NetSales
  FROM (SELECT p.PerceptionistID, p.BaseCommission, p.BonusCommission, h.WeekOf, h.WorkHours,
               h.PTOHours, h.HolidayHours, ROUND(h.WorkHours, 0) AS HoursRounded, 
               (SELECT COUNT(c.PerceptionistID)
                  FROM T_Call c 
                 WHERE c.PerceptionistID = p.PerceptionistID 
                   AND c.OutcomeID = @OutcomeSale 
                   AND EnteredOn BETWEEN @WeekOf AND DATEADD(dd, 7, @WeekOf)
                ) AS GrossSales,
                (SELECT COUNT (c.PerceptionistID)
                   FROM T_CallCredit AS cc
                   FULL JOIN T_Call  AS c ON cc.CallID = c.CallID
                  WHERE c.PerceptionistID = p.PerceptionistID 
                    AND cc.CallCreditStatusID NOT IN (17, 18)
                    AND cc.EnteredOn BETWEEN @WeekOf AND DATEADD(dd, 7, @WeekOf)
                ) AS Credits
           FROM T_Perceptionist p
           FULL JOIN T_PerceptionistHours h
             ON p.PerceptionistID = h.PerceptionistID
          WHERE h.WeekOf = @WeekOf
        ) AS X33;

Если вам тоже нужны агрегаты, вы также предоставляете соответствующее предложение GROUP BY.


Большая задержка при наборе ответа.

0 голосов
/ 28 сентября 2011

Просто знак, не связанный с вашим вопросом (место для комментариев слишком мало).

Ваши два FULL JOIN отменены, поскольку в запросах есть условия в предложении WHERE, которые удаляют все NULL, произведенные объединениями OUTER.

Это на самом деле INNER JOIN:

(
    SELECT COUNT (c.PerceptionistID)
    FROM T_CallCredit cc
        FULL JOIN T_Call c
            ON cc.CallID = c.CallID
    WHERE 
        c.PerceptionistID = p.PerceptionistID 
        AND cc.CallCreditStatusID NOT IN (17, 18)  -- 17 - 'Error in Customer Account', 18 - 'Courtesy Credit'
        AND cc.EnteredOn BETWEEN @WeekOf AND DATEADD(dd, 7, @WeekOf)
) AS Credits

и это RIGHT JOIN:

FROM T_Perceptionist p
    FULL JOIN T_PerceptionistHours h
        ON p.PerceptionistID = h.PerceptionistID
WHERE h.WeekOf = @WeekOf
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...