请查询SQL查询建议

时间:2013-11-15 10:31:42

标签: mysql sql

我正在尝试编写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

请求帮助。

谢谢, 大卫

2 个答案:

答案 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而不是空

,则会更改结果