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 Server

Sql Server 聚合或数据透视表查询

sql 在postgresql中使用动态列名创建交叉表/数据透视表形式的hstore字段

在 LINQ to Entities 中使用交叉应用取消透视数据

SVG路径的透视变换(四角扭曲)

基于包含子查询的查询的 ms-access 交叉表查询