在MySQL SELECT语句中使用SUM中的COALESCE

时间:2017-05-31 13:14:29

标签: mysql database

我有以下表格:

Table users
id  name     base_discount
1   jack     10
2   michael  20
3   richard  30

Table item
id  name     category_id  price
1   hammer   1            10
2   knife    2            15
3   spoon    2            12
4   plate    3            20
5   tree     4            400

Table category
id  name
1   tools
2   kitchen
3   dishes
4   garden

Table discount_category
id  user_id  category_id  discount
1   1        1            20
2   1        3            25
3   3        3            10
4   1        2            15

Table discount_item
id  user_id  item_id  discount
1   2        1        50
2   1        2        50

现在我想要实现的目标。我想将用户拥有的每件商品的折扣附加到正确的商品上。如果那不可用(NULL)我想附加用户拥有的每个类别的折扣。如果那不可用(NULL),我想附加用户拥有的基本折扣。然后我用折扣计算物品的新价格。但是,当我尝试在SUM()中使用COALESCE()时,我收到语法错误。我做错了什么?

以下是我当前的查询:

SELECT item.id, item.name, category.id, 
category.name AS category_name, item.price, SUM((100 -
COALESCE(
(
    SELECT discount_item.discount
    FROM discount_item
    INNER JOIN users ON discount_item.user_id = users.id
    WHERE users.id = '1' AND discount_item.item_id = item.id
),
(
    SELECT discount_category.discount
    FROM discount_category
    INNER JOIN users ON discount_category.user_id = users.id
    WHERE users.id = '1' AND discount_category.category_id = item.category_id
),
(
    SELECT users.base_discount
    FROM users
    WHERE users.id = '1'
)
)) / 100 * item.price) AS new_price,
FROM item
INNER JOIN category ON item.category_id = category.id;

另请参阅以下链接以获取SQL小提琴(无法在sqlfiddle.com上执行此操作,因为它无法加载)。在示例中,我为每个表名添加了后缀。 http://rextester.com/LCCKSD59098

1 个答案:

答案 0 :(得分:1)

new_price之后和FROM ITEM之前有一个额外的逗号,因此错误。

Rextester Demo

  • 如果您没有在group by中使用它们,请不要在select中选择其他列,因为在其他关系型RDBMS中,您将收到错误。

  • 同时使用alias表格名称可以更好地阅读并避免混淆。