我正在尝试编写SQL查询来计算许可证的价格。 请查看以下架构:
表:价格
| ID (bigint) | USERS(Bigint) | TYPE (varchar) | PRICE (BIGINT)
------------------------------------------------------------------
| 1 | 1 | other | 20 |
| 2 | 15 | local | 13.96 |
表:许可证
| ID (bigint) | USERID (Bigint) |STATUS(VARCHAR) | USERS(bigint) | DEVICES(BIGINT) | TYPE(VARCHAR) | REQUEST_TYPE (VARCHAR) |
--------------------------------------------------------------------------------------------------------------
| 1 | 13 | 10 | 10 | local | add |
| 2 | 13 | 15 | 20 | other | extend |
我的目标:
鉴于用户ID和类型,我想基于以下评论来计算所有许可证的总价格:
对于给定的用户ID和类型:
1)获取所有将request_type作为new(或)extend
的许可证2)对于每个此类许可,请将“用户数”(USERS列)与“价格”表中的USERS列进行匹配,并将计算作为设备*(来自价格表的相关价格)
3)使用此计算所有此类价格的总和并返回总价。
我正在尝试使用以下查询来执行此操作,但我还没有成功:
SELECT SUM(PRICE) FROM prices
LEFT OUTER JOIN licenses
ON (
prices.users=licenses.users
AND prices.type=licenses.type
)
WHERE licenses.userid=13
AND licenses.status='approved'
AND licenses.request_type IN ('add','extend')
请在此处查看SQL Fiddle:http://sqlfiddle.com/#!2/05f5cf
请求帮助。
谢谢, 大卫
答案 0 :(得分:0)
根据您的评论和更新,我认为您想要(不确定是否有必要比较许可证和用户的价格用户,但似乎您想要这个)
select coalesce(sum( p.users * p.price), 0)
FROM licenses l
inner join prices p
on p.type = l.type
--and p.users = l.users
where l.status = 'approved'
and l.request_type in ('add', 'extend')
and l.userid = 13
修改强>
事实上,您是否需要检查类型和用户是否完全相同,还是仅仅是用户?
如果您只需要检查用户,那么
inner join prices p
on p.users = l.users
如果您只需要检查类型
inner join prices p
on p.type = l.type
如果您需要两者,您的样本数据将为0。
请参阅SqlFiddle 3个版本。
答案 1 :(得分:0)
结果将为null,因为查询无法找到LEFT OUTER JOIN的条件
有查询
SELECT SUM(PRICE) FROM prices
LEFT OUTER JOIN licenses
ON (
prices.users=licenses.users
AND prices.type=licenses.type //cannot found condition on table
)
WHERE licenses.userid=13
AND licenses.status='approved'
AND licenses.request_type IN ('add','extend')
这是表格中的数据
表牌照
(1, 'approved', 10, 10, 'local', 'add', 13),
(2, 'approved', 15, 20, 'other', 'extend', 13);
和桌面价格
(1, 1, 'other', 20),
(2, 15, 'local', 13.96);
你的病情是
prices.users=licenses.users
AND prices.type=licenses.type //cannot found condition on table
that mean if from your table is
at licences table have a type="other" and users=15
but at prices table haven't have type="other" and users=15
所以结果为null
因为当我更改第一行表格价格时 (1,1,'其他',20) 变成(1,15,'其他',20),
将得到一个结果= 20
您需要更改第一行查询
SELECT SUM(PRICE) FROM prices
be
SELECT IFNULL(SUM(PRICE),0) FROM prices
如果未将行设置为0而不是空
,则会更改结果