0

我正在尝试编写一个 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 列)与“prices”表中的 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

请帮忙。

谢谢,大卫

4

2 回答 2

0

结果将为空,因为查询找不到 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

所以结果将为空

因为当我更改表格价格的第一行时 (1, 1, 'other', 20) 变为 (1, 15, 'other', 20),

那将有一个结果= 20

你需要改变你的第一行查询

SELECT SUM(PRICE) FROM prices

be

SELECT IFNULL(SUM(PRICE),0) FROM prices

如果没有找到该行,这将更改结果为 0 不为空

于 2013-11-15T11:03:07.190 回答
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

编辑

实际上,您是否需要检查 type AND users 是否相同,或者只是 users ?

如果您只需要检查用户,那么

inner join prices p
  on  p.users = l.users

如果您只需要检查类型

inner join prices p 
  on p.type = l.type

如果两者都需要,您的样本数据将获得 0。

请参阅具有 3 个版本的SqlFiddle 。

于 2013-11-15T10:47:15.060 回答