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”。