2011-09-27 50 views
1

我有以下SQL sp,我想添加一个只是'GrossSales' - 'Credits'的'NetSales'列。有没有办法在同一个SELECT语句中做到这一点?在SQL中添加列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,布赖恩

+1

哪个RDBMS?哪个版本? – 2011-09-27 20:19:48

+0

SQL Server 2008 R2 – BrianKE

回答

6

包裹与另一这样整个查询:

select *, a.GrossSales - a.Credits as NetSales 
from (
    --your query here 
) a 
+0

我实际上使用了临时表和次SELECT语句,因为我需要做更多的计算,但是您的建议让我思考了正确的方向。随着临时表我可以简单地写(GrossSales - 积分)作为NetSales。 – BrianKE

0

只是一个旁注,无关你的问题(评论空间太小)。

您的两个FULL JOIN被取消,因为查询条件在WHERE子句中删除由OUTER连接生成的任何NULL

这实际上是一个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 
+0

谢谢,不知道我是如何得到FULL JOIN的。 – BrianKE

1

如果你不想嵌套查询和你想只有一个选择,你必须在列列表中添加另一列(请注意,它实际上是复制& 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

通常情况下,您只需写'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子句太​​。


输入答案时的长时间延迟。