Sql 查询以从3个表中获取结果
我需要的是存储过程,根据3个表给出以下结果: 我得到的是: 表1:TBL_用户Sql 查询以从3个表中获取结果,sql,sql-server,Sql,Sql Server,我需要的是存储过程,根据3个表给出以下结果: 我得到的是: 表1:TBL_用户 userid Client_name ------ -------- 2101 client 1 2102 client 2 2105 client 3 2106 client 4 表2:账户余额 Acbc_UserID Acbc_Remained ----------- ------------- 2101 2.32 2102
userid Client_name
------ --------
2101 client 1
2102 client 2
2105 client 3
2106 client 4
表2:账户余额
Acbc_UserID Acbc_Remained
----------- -------------
2101 2.32
2102 2.727
2105 223.783
2106 26.77
表3=opper_价格
Opprice_UserID Opprice_Price
------- -------
2101 0.008
2101 0.008
2101 0.008
2101 0.008
2102 0.009
2102 0.009
2102 0.009
2102 0.009
2105 0.009
2105 0.009
2105 0.009
2105 0.009
2106 0.010
2106 0.010
2106 0.010
2106 0.010
(这里我们需要一个平均值,例如user_id 2106
有4个价格,因此我们需要得到平均值,该平均值再次为0.009)
根据上表,我希望得到以下结果:
如果用户id在表3中不存在,则使用0.006的平均价格
Client_Name average_price Acbc_Remained SMS_remain
Client 1 0.008 2.32 ( Acbc_Remained /average_price)
Client 2 0.009 2.727 (2.727/0.009=303)
Client 3 0.009 223.783 24864.7778
Client 4 0.010 26.77 2677
========
Total of column SMS_remain
所以我想做的是将这个存储过程添加到SQL Server电子邮件中,这样整个结果表也将被发送
这是我到目前为止所做的,但价格为零:
BEGIN
SET NOCOUNT ON;
SELECT Prj_Users.Users_ID
,Prj_Users.Users_Name AS prj_users
,Prj_AccountBalance.Acbc_Remained AS Prj_AccountBalance
,Prj_OpperPrice.Opprice_Price AS Price
FROM Prj_Users LEFT JOIN Prj_AccountBalance
ON Prj_Users.Users_ID = Prj_AccountBalance.Acbc_UserID
LEFT JOIN Prj_OpperPrice
ON Prj_OpperPrice.Opprice_UserID = Prj_OpperPrice.Opprice_Price
END
多谢各位
Select Client_Name
,average_price = avg(Opprice_Price)
,Acbc_Remaind = avg(Acbc_Remained)
,SMS_Remain = case when avg(Opprice_Price)=0 then 0 else avg(Acbc_Remained)/avg(Opprice_Price) end
From TBL_User A
Join opper_price B on (A.userid=B.Opprice_UserID)
Join Accountbalance C on (A.userid=C.Acbc_UserID)
Group By Client_Name
返回
Client_Name average_price Acbc_Remaind SMS_Remain
client 1 0.008 2.32 290.00
client 2 0.009 2.727 303.00
client 3 0.009 223.783 24864.7777
client 4 0.01 26.77 2677.00
这一项包括总计,并减少了冗余计算:
Select A.*
,SMS_Remain = case when average_price=0 then 0 else Acbc_Remaind/average_price end
,Total_SMS_Remain =SUM(case when average_price=0 then 0 else Acbc_Remaind/average_price end) OVER ()
From (
Select Client_Name
,average_price = isnull(avg(Opprice_Price),.006)
,Acbc_Remaind = isnull(avg(Acbc_Remained),0)
From @TBL_User A
Left Join @opper_price B on (A.userid=B.Opprice_UserID)
Left Join @Accountbalance C on (A.userid=C.Acbc_UserID)
Group By Client_Name
) A
返回
Client_Name average_price Acbc_Remaind SMS_Remain Total_SMS_Remain
client 1 0.008 2.32 290.00 28134.7777
client 2 0.009 2.727 303.00 28134.7777
client 3 0.009 223.783 24864.7777 28134.7777
client 4 0.01 26.77 2677.00 28134.7777
client 5 0.006 0.00 0.00 28134.7777
注意:在客户端5上,Acbc_Remaind上的.0006和0是通过使用ISNULL()函数来完成的,这样听起来就不会像是简单地外包了一些工作,因此,最好是同时发布您迄今为止尝试过的查询,以及您需要帮助的地方。您当前的查询是什么,出现了什么错误?说你需要什么不是一个问题,所以现在还不清楚你在问什么。问题是我知道如何进行连接,但我不知道如何创建它们不存在的列,如sms_remain?我应该补充,根据你的实际数据,你可能想要或需要左连接和/或使用isnull(值,0)嗨,谢谢你的帮助。错误:Msg 1087,级别15,状态2,第5行必须声明表变量“@TBL_User”。删除@符号。我只是创建了三个@table变量,而不是创建了一个实际的table。我更新了查询,删除了@symbols。非常感谢。最后一件事是,你能告诉我,如果平均价格(Opprice_Price)不存在,那么我想使用0.006的价格。你能告诉我怎么做吗?