mySQL 多重连接,结果行为空

标签 mysql join group-by exists

我有两个表CLIENSTSPRICES,我想加入它们以计算每种商品类型的总价格,每年
我的查询必须对每个项目的值进行求和,按类型对它们进行分组,然后将它们与客户表中相应项目的类型金额相乘;如果所选年份没有项目,则还显示空值。

这是我的表格:

CLIENTS
| name | item_A | item_B | item_C |
|  X   |   10   |   10   |   10   |
|  Y   |    5   |   15   |    0   |
|  Z   |    0   |    0   |   20   |

PRICES
| item | item_type | year | value |
|  a1  |     A     | 2010 |   1   |
|  a2  |     A     | 2010 |   2   |
|  b1  |     B     | 2010 |   2   | 
|  b2  |     B     | 2010 |   3   |
|  c1  |     C     | 2010 |   3   |
|  a1  |     A     | 2011 |   4   |
|  b1  |     B     | 2011 |   5   |

我正在寻找一个能够执行所选每年的后续结果的查询:

2010
| name | price_A | price_B | price_C |
|  X   |    30   |    60   |    30   |
|  Y   |    15   |    90   |     0   |
|  Z   |     0   |     0   |    60   |

2011
| name | price_A | price_B | price_C        |
|  X   |    40   |    50   | none/null/zero |
|  Y   |    20   |    75   | none/null/zero |
|  Z   |     0   |     0   | none/null/zero |

这是我的尝试,但不幸的是它在第一年(2010 年)正确执行,但在第二年(2011 年)没有返回任何行。
我想这是由于第三次连接在第二年没有 total_C 结果。
要求 mySQL 加入“如果结果存在”选项卡或将值设置为“none/null/zero”的正确方法是什么?

SELECT 
`name`, 
`item_A` * `total_A`.`total_value` AS  `price_A`,
`item_B` * `total_B`.`total_value` AS  `price_B`, 
`item_C` * `total_C`.`total_value` AS  `price_C`
FROM `CLIENTS`
JOIN
 (
SELECT 
`item_type`,
SUM(`value`) AS `total_value`
FROM `PRICES` 
WHERE `item_type`='A' AND `year` LIKE '2010'
GROUP BY `item_type`
) AS `total_A`
JOIN
 (
SELECT 
`item_type`,
SUM(`value`) AS `total_value`
FROM `PRICES` 
WHERE `item_type`='B' AND `year` LIKE '2010'
GROUP BY `item_type`
) AS `total_B`
JOIN
 (
SELECT 
`item_type`,
SUM(`value`) AS `total_value`
FROM `PRICES` 
WHERE `item_type`='C' AND `year` LIKE '2010'
GROUP BY `item_type`
) AS `total_C`

最佳答案

如果我正确理解你的问题,我认为你应该使用这样的东西:

SELECT
  s.year,
  clients.name,
  clients.item_A*s.sum_A,
  clients.item_B*s.sum_B,
  clients.item_C*s.sum_C
FROM
  clients INNER JOIN (
  SELECT
    year,
    SUM(CASE WHEN item_type='A' THEN value END) sum_A,
    SUM(CASE WHEN item_type='B' THEN value END) sum_B,
    SUM(CASE WHEN item_type='C' THEN value END) sum_C
  FROM
    prices
  GROUP BY
    year) s
ORDER BY
  s.year

请参阅 fiddle here .

在子查询中,我对每年的 item_type 的总值进行求和。然后我与客户表进行笛卡尔连接。

关于mySQL 多重连接,结果行为空,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15861474/

相关文章:

Mysql当前版本不支持 'LIMIT & IN/ALL/ANY/SOME subquery'

php - 选择连接 MYSQL

mysql - SQL 查询在 phpMyAdmin 上不起作用,因为我收到错误

php - 密码最小长度不起作用

mysql删除类似post : can't specify target table 'wp_posts' for update in FROM clause

sql-server - 二级Top N SQL服务器

tsql - 内连接计数和分组依据

mysql - ON 子句条件与 MySQL 中的 WHERE 子句条件 WITH JOIN

java - Spring 启动+ hibernate : Duplicate entry Exception while save entity

mysql - 如何在仍然使用索引的同时按 MySQL 中的日期/时间段对结果进行分组?