>我有一个包含以下列的表格:
id
first
last
institution
address
space1_1_value
space1_2_value
space2_1_value
space2_2_value
space3_1_value
space3_2_value
agreement
** 例如,减少字段计数。
最后,我想将查询导出到电子表格,但我似乎无法获得一个很好的工作查询。(因此帖子(
虽然表中的一条记录/行将具有 id、第一个、最后一个、机构、地址、space1_1_value、space1_2_value和协议字段/列的值......
它可能有也可能没有 col 的值:
space2_1_value space2_2_value 和 space3_1_value space3_2_value
我不确定解释它......但或多或少,..我想将表中的每条记录/行分解为 1-3 行(因为缺乏更好的解释(
因此,对于表中的每一行/记录..
我想返回以下内容:
ID | 首页 | 尾页 | 机构 | 地址 | space1_1_value | space1_2_value |协议
如果space2_1_value有价值,那么:
ID | 首页 | 尾页 | 机构 | 地址 | space2_1_value | space2_2_value |协议
如果space3_1_value有价值,则:
ID | 首页 | 尾页 | 机构 | 地址 | space3_1_value | space3_2_value |协议
总结一下..每条记录都有上面列出的所有初始列。我试图通过"spaceX_X_value"组"分解"每行的返回。如果不是空的。
在这里阅读: http://www.mysqltutorial.org/sql-union-mysql.aspx
它说使用 UNION 垂直附加结果。.
但我在工作时没有得到任何有价值的东西。
失败的尝试(似乎臃肿(...我觉得我可以在每个所需的行/结果中专门选择"静态/共享"字段,并联合/选择不同的spaceX_Xvalue组。
SELECT * FROM
(
(SELECT first, last, space2_value FROM report WHERE space2_value <> '')
UNION
(SELECT first, last, space3_value FROM report WHERE space3_value <> '')
) AS results
编辑/更新:
从下面的评论...这是一个工作示例:(只是感觉有点多余,键入相同的 cols 名称,如 first、last..等为每个选择(
SELECT first, last, space1_value as space_value FROM report
UNION
SELECT first, last, space2_value as space_value FROM report WHERE space2_value <> ''
UNION
SELECT first, last, space3_value as space_value FROM report WHERE space3_value <> ''
ORDER BY first
如果您不希望自动删除重复的行,请考虑使用 UNION ALL。
来自 MySQL 文档:
UNION 的默认行为是从结果中删除重复的行。可选的 DISTINCT 关键字除了默认值外没有任何效果,因为它还指定了重复行删除。使用可选的 ALL 关键字时,不会删除重复行,结果包括所有 SELECT 语句中的所有匹配行。
SELECT first, last, space2_value as space_value FROM report WHERE space2_value <> ''
UNION
SELECT first, last, space3_value as space_value FROM report WHERE space3_value <> ''
在 UINION 的每个查询中,列名必须相等
使用unpivot
将列分成行:
数据:我创建了一个名为yourtable
的表,并填充了一些数据:
id first last institution address space1_1_value space1_2_value space2_1_value space2_2_value space3_1_value space3_2_value agreement
----------- ---------- ---------- ----------- -------------------- -------------- -------------- -------------- -------------- -------------- -------------- --------------------
1 oliver koo mac 123 street 1 1 2 3 3 5 agree
2 mr.derp herp carl sesame street 7 7 NULL 1 4 9 disagree
查询:然后我执行了这个查询,包括拖曳unpivot
关系运算符:
SELECT id,first, last, institution, address, spacex_1_value , spacex_2_value
from yourtable
unpivot
(spacex_1_value for x1 in
(space1_1_value, space2_1_value,space3_1_value)
) unpvt1
unpivot
(
spacex_2_value for x2 in
(space1_2_value, space2_2_value,space3_2_value)
) unpvt2
WHERE SUBSTRING(x1,6,1) = SUBSTRING(x2,6,1)
结果:
id first last institution address spacex_1_value spacex_2_value
----------- ---------- ---------- ----------- -------------------- -------------- --------------
1 oliver koo mac 123 street 1 1
1 oliver koo mac 123 street 2 3
1 oliver koo mac 123 street 3 5
2 mr.derp herp carl sesame street 7 7
2 mr.derp herp carl sesame street 4 9
注意:where 子句对于连接 X1(未选择(和 X2(未选择(列至关重要。没有它,我们还没有告诉 SQL Server 第二组未透视数据如何与第一组匹配。SQL 将执行交叉连接。因此,where 子句是过滤掉不需要的行所必需的。
希望这有帮助