MySQL双连接/透视表

MySQL双连接/透视表,mysql,sql,join,pivot-table,Mysql,Sql,Join,Pivot Table,这是一个 我有一个表,inventory,其中有一些数据如下所示: +--------------+---------+---------------+--------------+------------+------------+ | pmkInventory | fnkPart | inventoryYear | inventoryNum | inventoryR | inventoryC | +--------------+---------+---------------+----

这是一个


我有一个表,inventory,其中有一些数据如下所示:

 +--------------+---------+---------------+--------------+------------+------------+
| pmkInventory | fnkPart | inventoryYear | inventoryNum | inventoryR | inventoryC |
+--------------+---------+---------------+--------------+------------+------------+
|            1 |      51 |          2016 |            6 | A          |          4 |
|            2 |    2075 |          2016 |           40 | C          |          4 |
|            3 |      50 |          2016 |            3 | A          |          8 |
|            4 |       3 |          2016 |          600 | F          |          3 |
|            5 |       3 |          2017 |          650 | F          |          3 |
|            6 |     100 |          2016 |            2 | B          |          1 |
|            7 |      50 |          2017 |            5 | A          |          8 |
|            8 |      51 |          2017 |           16 | A          |          4 |
+--------------+---------+---------------+--------------+------------+------------+
+---------+---------------+--------------+------------+------------+---------------+--------------+------------+------------+
| fnkPart | inventoryYear | inventoryNum | inventoryR | inventoryC | inventoryYear | inventoryNum | inventoryR | inventoryC |
+---------+---------------+--------------+------------+------------+---------------+--------------+------------+------------+
|      51 | 2016          | 6            | A          | 4          | 2017          | 16           | A          | 4          |
|    2075 | 2016          | 40           | C          | 4          | NULL          | NULL         | NULL       | NULL       |
|      50 | 2016          | 3            | A          | 8          | 2017          | 5            | A          | 8          |
|       3 | 2016          | 600          | F          | 3          | 2017          | 650          | F          | 3          |
|     100 | 2016          | 2            | B          | 1          | NULL          | NULL         | NULL       | NULL       |
|      40 | NULL          | NULL         | NULL       | NULL       | NULL          | NULL         | NULL       | NULL       |
|     504 | NULL          | NULL         | NULL       | NULL       | NULL          | NULL         | NULL       | NULL       |
+---------+---------------+--------------+------------+------------+---------------+--------------+------------+------------+
它每年都有每个零件的计数和位置信息。将有超过2年的时间(不仅仅存储2016年和2017年),但我一次只需要显示两年

我需要用SQL语句返回如下内容:

 +--------------+---------+---------------+--------------+------------+------------+
| pmkInventory | fnkPart | inventoryYear | inventoryNum | inventoryR | inventoryC |
+--------------+---------+---------------+--------------+------------+------------+
|            1 |      51 |          2016 |            6 | A          |          4 |
|            2 |    2075 |          2016 |           40 | C          |          4 |
|            3 |      50 |          2016 |            3 | A          |          8 |
|            4 |       3 |          2016 |          600 | F          |          3 |
|            5 |       3 |          2017 |          650 | F          |          3 |
|            6 |     100 |          2016 |            2 | B          |          1 |
|            7 |      50 |          2017 |            5 | A          |          8 |
|            8 |      51 |          2017 |           16 | A          |          4 |
+--------------+---------+---------------+--------------+------------+------------+
+---------+---------------+--------------+------------+------------+---------------+--------------+------------+------------+
| fnkPart | inventoryYear | inventoryNum | inventoryR | inventoryC | inventoryYear | inventoryNum | inventoryR | inventoryC |
+---------+---------------+--------------+------------+------------+---------------+--------------+------------+------------+
|      51 | 2016          | 6            | A          | 4          | 2017          | 16           | A          | 4          |
|    2075 | 2016          | 40           | C          | 4          | NULL          | NULL         | NULL       | NULL       |
|      50 | 2016          | 3            | A          | 8          | 2017          | 5            | A          | 8          |
|       3 | 2016          | 600          | F          | 3          | 2017          | 650          | F          | 3          |
|     100 | 2016          | 2            | B          | 1          | NULL          | NULL         | NULL       | NULL       |
|      40 | NULL          | NULL         | NULL       | NULL       | NULL          | NULL         | NULL       | NULL       |
|     504 | NULL          | NULL         | NULL       | NULL       | NULL          | NULL         | NULL       | NULL       |
+---------+---------------+--------------+------------+------------+---------------+--------------+------------+------------+
从我的阅读中,听起来我需要某种透视表,因为MySQL没有内置透视表,所以我需要使用
CASE
语句。谈到pivot表,但我不知道如何在不使用
count
函数的情况下使用它。我不需要计算任何东西,因为我已经在数据库中存储了数据-我只需要显示它


我提出了一种非透视表解决方案。它正确显示年份,但不显示具有空值的行。我有一个零件表,里面有几千个零件。我正在将库存表加入其中。我认为,通过执行
左联接
我将获得所有零件,即使库存表中没有指定年份的数据

这是:

SELECT p.pmkPart, p.partNumber, 
       i1.fnkPart, i1.inventoryYear, i1.inventoryNum, i1.inventoryR, i1.inventoryC, 
       i2.fnkPart, i2.inventoryYear, i2.inventoryNum, i2.inventoryR, i2.inventoryC
FROM part AS p
LEFT JOIN inventory as i1
       ON p.pmkPart = i1.fnkPart
LEFT JOIN inventory as i2
       ON p.pmkPart = i2.fnkPart
WHERE i1.inventoryYear = 2016
AND i2.inventoryYear = 2017
GROUP BY p.pmkPart
这个查询会给我类似的结果。请注意,它缺少部分
2075
100
,因为它们没有2017年的值。它还将
零件
表中的剩余零件排除在外,这些零件在
库存
表中没有值

+---------+------------+---------+---------------+--------------+------------+------------+---------+---------------+--------------+------------+------------+
| pmkPart | partNumber | fnkPart | inventoryYear | inventoryNum | inventoryR | inventoryC | fnkPart | inventoryYear | inventoryNum | inventoryR | inventoryC |
+---------+------------+---------+---------------+--------------+------------+------------+---------+---------------+--------------+------------+------------+
|      51 | AB-l34     |      51 |          2016 |            6 | A          |          4 |      51 |          2017 |           16 | A          |          4 |
|      50 | AB-l36     |      50 |          2016 |            3 | A          |          8 |      50 |          2017 |            5 | A          |          8 |
|       3 | C-5-BT     |       3 |          2016 |          600 | F          |          3 |       3 |          2017 |          650 | F          |          3 |
+---------+------------+---------+---------------+--------------+------------+------------+---------+---------------+--------------+------------+------------+

有人对我如何修改现有查询以获得正确结果有什么建议吗?或者如何创建符合我要求的透视表

我选择的年份需要能够改变,但我一次只能选择两个,2016年和2017年,或者2016年和2018年,或者2017年和2018年,等等


我已经找到了如何使用
php
MySQL
的组合来实现这一点,但我正在迁移到一个新的平台,在这个平台上,服务器端脚本不是一个选项,因此需要将所有内容移动到SQL中,尝试将年份条件添加到联接本身:

SELECT p.pmkPart, p.partNumber, 
       i1.fnkPart, i1.inventoryYear, i1.inventoryNum, i1.inventoryR, i1.inventoryC, 
       i2.fnkPart, i2.inventoryYear, i2.inventoryNum, i2.inventoryR, i2.inventoryC
FROM part AS p
LEFT JOIN inventory as i1
       ON p.pmkPart = i1.fnkPart
       AND i1.inventoryYear = 2016
LEFT JOIN inventory as i2
       ON p.pmkPart = i2.fnkPart
       AND i2.inventoryYear = 2017

此外,此查询中没有聚合,因此您不需要按任何内容分组。

尝试将年份条件添加到联接本身:

SELECT p.pmkPart, p.partNumber, 
       i1.fnkPart, i1.inventoryYear, i1.inventoryNum, i1.inventoryR, i1.inventoryC, 
       i2.fnkPart, i2.inventoryYear, i2.inventoryNum, i2.inventoryR, i2.inventoryC
FROM part AS p
LEFT JOIN inventory as i1
       ON p.pmkPart = i1.fnkPart
       AND i1.inventoryYear = 2016
LEFT JOIN inventory as i2
       ON p.pmkPart = i2.fnkPart
       AND i2.inventoryYear = 2017

此外,此查询中没有聚合,因此您不需要按任何内容分组。

非常感谢。我不记得可以在连接中添加“where”。非常感谢。我不记得可以在连接中加上“where”。