2014-09-26 55 views
0

我想创建一个基于来自其他几列的信息计算的列,这对我来说很难作为SQL的新人。下面是我尝试使用的代码,但它对“Sum(SlotActual + TableActual)As Actual”这一行感到愤怒。我猜这是由于这些是别名。我想我需要使用子查询,但我不确定,因为我以前没有这样做过。如果可能的话,我宁愿不要显示SlotActual或TableActual,我只需要计算这些,然后添加它们以获得实际值。这是在SQL 2008中完成的。请让我知道我是否遗漏了您需要的任何信息。复杂的添加问题

我越来越
Select Ltrim(Rtrim(P.Player_ID)) as "Player ID", 
Ltrim(Rtrim(P.FirstName)) as "First Name", 
Ltrim(Rtrim(P.LastName)) as "Last Name", 
Sum(CashIn) as "Cash In", 
Sum(CashOut) as "Cash Out", 
Sum(Jackpot) as "Jackpot", 
Sum(case when S.StatType = 'Slot' then S.CashIn - S.CashOut - S.JackPot end) as SlotActual, 
Sum(case when S.StatType = 'Pit' then S.CashIn + S.ChipsIn + S.FrontIn + S.CreditIn - S.CashOut end) as TableActual, 
Sum(SlotActual + TableActual) As Actual 

From dbo.CDS_PLAYER as P 
Join dbo.CDS_ACCOUNT as A 
    On P.Player_ID = A.Primary_ID 
Join dbo.CDS_STATDAY as S 
    On P.Player_ID = S.Meta_ID 

Where S.GamingDate Between '09/15/2014 12:00:00 AM' and '09/21/2014 11:59:59 PM' 
And P.EntryDate Between '09/15/2014 12:00:00 AM' and '09/21/2014 11:59:59 PM' 
And S.IDType = 'P' 

Group by Ltrim(Rtrim(P.Player_ID)) , 
Ltrim(Rtrim(P.FirstName)), 
Ltrim(Rtrim(P.LastName)) 

错误信息如下:

消息207,级别16,状态3,行3 无效的列名称SlotActual“。 消息207,级别16,状态3,行3 无效的列名称'TableActual'。

+0

请张贴错误的SQL是给你的。 – 2014-09-26 17:58:31

+0

您不能在集合函数中使用别名。 sql服务器不支持这个。尝试把你的整个公式扔在总和中。 – paqogomez 2014-09-26 18:02:22

回答

1

好的,我现在看到了问题。你不能像这样引用一个选择的命名字段。

替换:

Sum(SlotActual + TableActual) As Actual 

而是执行此操作:

(Sum(case when S.StatType = 'Slot' then S.CashIn - S.CashOut - S.JackPot end) + 
Sum(case when S.StatType = 'Pit' then S.CashIn + S.ChipsIn + S.FrontIn + S.CreditIn - S.CashOut end)) As Actual 

要允许空值:

(Sum(ISNULL(case when S.StatType = 'Slot' then S.CashIn - S.CashOut - S.JackPot end), 0) + 
Sum(ISNULL(case when S.StatType = 'Pit' then S.CashIn + S.ChipsIn + S.FrontIn + S.CreditIn - S.CashOut end), 0)) As Actual 

ISNULL允许当左参数是要使用的值空值。

如果您的数据允许您也可以为CASE添加一个其他值,S不会有任何值。

(Sum(case when S.StatType = 'Slot' then S.CashIn - S.CashOut - S.JackPot ELSE 0 end) + 
Sum(case when S.StatType = 'Pit' then S.CashIn + S.ChipsIn + S.FrontIn + S.CreditIn - S.CashOut ELSE 0 end)) As Actual 
+0

好吧,这是有道理的,并得到真正接近我需要的东西,但有一个我忘记提及的渔获。有时槽或坑将为空。当我尝试这种变化,如果他们中的一个是null整个回来返回null是否有一种方法来错误捕获null并将其变为0或忽略它? – 2014-09-26 18:05:59

+0

用'ISNULL'或'Coalesce'将它包裹起来, – paqogomez 2014-09-26 18:07:00

+0

更新了我的文章,以表达null关注。 – 2014-09-26 18:10:45

0

使用的包装是这样的:

select X.*, Sum(ISNULL(SlotActual,0) + ISNULL(TableActual,0)) As Actual 
From (
Select Ltrim(Rtrim(P.Player_ID)) as "Player ID", 
Ltrim(Rtrim(P.FirstName)) as "First Name", 
Ltrim(Rtrim(P.LastName)) as "Last Name", 
Sum(CashIn) as "Cash In", 
Sum(CashOut) as "Cash Out", 
Sum(Jackpot) as "Jackpot", 
Sum(case when S.StatType = 'Slot' then S.CashIn - S.CashOut - S.JackPot end) as SlotActual, 
Sum(case when S.StatType = 'Pit' then S.CashIn + S.ChipsIn + S.FrontIn + S.CreditIn - S.CashOut end) as TableActual, 

From dbo.CDS_PLAYER as P 
Join dbo.CDS_ACCOUNT as A 
    On P.Player_ID = A.Primary_ID 
Join dbo.CDS_STATDAY as S 
    On P.Player_ID = S.Meta_ID 

Where S.GamingDate Between '09/15/2014 12:00:00 AM' and '09/21/2014 11:59:59 PM' 
And P.EntryDate Between '09/15/2014 12:00:00 AM' and '09/21/2014 11:59:59 PM' 
And S.IDType = 'P' 

Group by Ltrim(Rtrim(P.Player_ID)) , 
Ltrim(Rtrim(P.FirstName)), 
Ltrim(Rtrim(P.LastName)) 
) X