Sql 查询交叉变换或透视?
Posted
技术标签:
【中文标题】Sql 查询交叉变换或透视?【英文标题】:Sql query Cross Transform or Pivot? 【发布时间】:2020-06-18 20:26:59 【问题描述】:我对 mysql 数据库有这个查询:
SELECT
pim_pimcore_database.object_query_RGL.rulecode AS "rulecode",
pim_pimcore_database.object_query_RGL.DescrizioneRegola AS "rule_desc",
pim_pimcore_database.object_relations_RGL.position AS "id",
pim_pimcore_database.objects.o_classId,
pim_pimcore_database.objects.o_key,
pim_pimcore_database.object_collection_ruleIF_RGL.Operatore,
pim_pimcore_database.object_collection_ruleIF_RGL.Concatenatore
FROM
pim_pimcore_database.object_query_RGL
LEFT JOIN pim_pimcore_database.object_relations_RGL
ON pim_pimcore_database.object_query_RGL.oo_id =
pim_pimcore_database.object_relations_RGL.src_id
LEFT JOIN pim_pimcore_database.objects
ON pim_pimcore_database.object_relations_RGL.dest_id = pim_pimcore_database.objects.o_id
LEFT JOIN pim_pimcore_database.object_collection_ruleIF_RGL
ON pim_pimcore_database.object_relations_RGL.position =
pim_pimcore_database.object_collection_ruleIF_RGL.`index`
AND pim_pimcore_database.object_relations_RGL.src_id =
pim_pimcore_database.object_collection_ruleIF_RGL.o_id
GROUP BY
pim_pimcore_database.object_relations_RGL.position AS "ID"
WHERE
pim_pimcore_database.object_query_RGL.oo_id = 1042 AND
pim_pimcore_database.object_relations_RGL.ownername ="IfStatement"
这给了我结果:
但我需要的是这样的表格:
如何更改所需输出的查询?
【问题讨论】:
我修正了您的格式 - 请检查更改(以便您知道下次发布问题的时间) 如果您使用支持 WITH 的 MySQL 版本,您可以将整个内容添加为x
,然后像 x x1 JOIN x x2 ON x1.id = x2.id AND x1.o_classid = 'OPT' and x2.o_classid = 'COM'
一样将其连接到自身。 ps;我们通常在 GROUP BY 之前写 WHERE (MySQL 可能允许你摆脱那种事情)并且你应该在 ONLY_FULL_GROUPBY 模式下运行你的 MySQL;此 SQL 将一列分组,但既不聚合函数也不分组选择列表中的其他列,这可能导致意外结果
pivot 与早期版本你可以看到***.com/questions/61920905/…
在没有任何聚合函数的情况下,GROUP BY 子句永远不合适
请看Why should I provide an MCRE for what seems to me to be a very simple SQL query
【参考方案1】:
您的笛卡尔积(行数加倍)似乎来自在 o_id 上加入 pim_pimcore_database.objects
。
如果您在查询中使用相关别名和仅选择与该别名相关的o_classid
类型的谓词在查询中表示此表两次(将其连接两次),则笛卡尔将消失,您将得到结果你寻求:
SELECT
...,
o_opt.key as OPT,
o_com.key as COM,
...
LEFT JOIN pim_pimcore_database.objects o_opt ON ... AND o_opt.o_classid = 'OPT'
LEFT JOIN pim_pimcore_database.objects o_com ON ... AND o_com.o_classid = 'COM'
【讨论】:
我会试试这个解决方案:)以上是关于Sql 查询交叉变换或透视?的主要内容,如果未能解决你的问题,请参考以下文章
sql 在postgresql中使用动态列名创建交叉表/数据透视表形式的hstore字段