【问题标题】:SQL Dynamic Pivot group by error 1172SQL 动态数据透视组错误 1172
【发布时间】:2017-10-02 20:29:01
【问题描述】:

我一直试图让 SQL 查询在我的数据库上运行,但没有太多的 SQL 知识和具有多层深度的数据库,这让我很头疼。我真的很接近我想要实现的目标,我认为这只是我误解的一个小细节。

我有一张orders 的表格,我想很好地导出它。我正在使用动态枢轴为每个purchasables.sku 生成一个新列,该列中的lineitems.qty 属于order。我只想显示属于usersorders,其中usergroup.id4。然后我想显示content.field_customerReference 字段,其中content.elementId 等于orders.id

我一直在使用this 解释并最终得到这个查询:

SET @@group_concat_max_len = 32000;
SET @sql = NULL;

SELECT
  GROUP_CONCAT(DISTINCT
    CONCAT(
      'MAX(IF(purchasables.sku = ''',
      purchasables.sku,
      ''', lineitems.qty, NULL)) AS ',
      CONCAT("'", purchasables.sku, "'")
    )
  ) INTO @sql
FROM craft_commerce_orders AS orders
JOIN craft_commerce_customers AS customers
  on customers.id = orders.customerId
JOIN craft_users AS users
  on users.id = customers.userId
JOIN craft_commerce_lineitems AS lineitems
    ON lineitems.orderId = orders.id
JOIN craft_commerce_purchasables AS purchasables
    ON purchasables.id = lineitems.purchasableId
JOIN craft_content AS content
    ON content.elementId = orders.id
JOIN craft_usergroups_users AS usergroup_users
    ON usergroup_users.userId = users.id
WHERE usergroup_users.groupId = 4
GROUP BY orders.id;

SET @sql = CONCAT(
    'SELECT 
        orders.dateCreated AS Datum,
        orders.id AS ID,
        users.firstName AS Gebruiker,
        content.field_customerReference AS Referentie,
        ', @sql, '
      FROM craft_commerce_orders AS orders
    JOIN craft_commerce_customers AS customers
        on customers.id = orders.customerId
    JOIN craft_users AS users
        on users.id = customers.userId
    JOIN craft_commerce_lineitems AS lineitems
        ON lineitems.orderId = orders.id
    JOIN craft_commerce_purchasables AS purchasables
        ON purchasables.id = lineitems.purchasableId
    JOIN craft_content AS content
        ON content.elementId = orders.id
    JOIN craft_usergroups_users AS usergroup_users
        ON usergroup_users.userId = users.id
    WHERE usergroup_users.groupId = 4
    GROUP BY orders.id');

PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;

这给出了错误1172 'Result consisted of more than one row'。它可以在没有GROUP BY orders.id 的情况下工作,但随后它将所有结果合并到一行中。我希望每个订单都是单独的一行。如果我删除动态枢轴并手动填写sku,它可以工作:

SELECT orders.dateCreated,
       orders.id,
       users.firstName,
       MAX(IF(purchasables.sku = '999992', lineitems.qty, NULL)) as '999992',
       MAX(IF(purchasables.sku = '9999991', lineitems.qty, NULL)) as '9999991',
       content.field_customerReference
FROM craft_commerce_orders AS orders
JOIN craft_commerce_customers AS customers
  on customers.id = orders.customerId
JOIN craft_users AS users
  on users.id = customers.userId
JOIN craft_commerce_lineitems AS lineitems
    ON lineitems.orderId = orders.id
JOIN craft_commerce_purchasables AS purchasables
    ON purchasables.id = lineitems.purchasableId
JOIN craft_content AS content
    ON content.elementId = orders.id
JOIN craft_usergroups_users AS usergroup_users
    ON usergroup_users.userId = users.id
WHERE usergroup_users.groupId = 4
GROUP BY orders.id

感谢任何帮助。

编辑:这是我根据霍根的建议运行的查询:

SET @sql = NULL;

SELECT
  GROUP_CONCAT(DISTINCT X.X) INTO @sql
FROM 
(
  SELECT DISTINCT
      CONCAT(
        'MAX(IF(purchasables.sku = ''',
        purchasables.sku,
        ''', lineitems.qty, NULL)) AS ''',
        purchasables.sku, '''' ) as X
  FROM craft_commerce_orders AS orders
  JOIN craft_commerce_customers AS customers on customers.id = orders.customerId
  JOIN craft_users AS users on users.id = customers.userId
  JOIN craft_commerce_lineitems AS lineitems ON lineitems.orderId = orders.id
  JOIN craft_commerce_purchasables AS purchasables ON purchasables.id = lineitems.purchasableId
  JOIN craft_content AS content ON content.elementId = orders.id
  JOIN craft_usergroups_users AS usergroup_users ON usergroup_users.userId = users.id
  WHERE usergroup_users.groupId = 4
) AS X;

PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;

这给出了错误

1064 you have an error in your sql syntax near 'MAX(IF(purchasables.sku = '999992', lineitems.qty, NULL)) AS '999992',MAX(IF(pur' at line 1

【问题讨论】:

  • 我很高兴今天晚些时候再讨论这个问题,但我认为要解决我的问题,不需要了解数据库的外观。我希望有人能告诉我这样的事情:“group by 不能与 ... 结合使用,请尝试 .... 代替”

标签: mysql sql relational-database dynamic-pivot


【解决方案1】:

在这里我做了一个单独的子查询。如果仍然出现错误,您可以自行测试——我认为问题出在"s

SELECT
  GROUP_CONCAT(DISTINCT X.X) INTO @sql
FROM 
(
  SELECT DISTINCT
      CONCAT(
        'MAX(IF(purchasables.sku = ''',
        purchasables.sku,
        ''', lineitems.qty, NULL)) AS ''',
        purchasables.sku, '''' ) as X
  FROM craft_commerce_orders AS orders
  JOIN craft_commerce_customers AS customers on customers.id = orders.customerId
  JOIN craft_users AS users on users.id = customers.userId
  JOIN craft_commerce_lineitems AS lineitems ON lineitems.orderId = orders.id
  JOIN craft_commerce_purchasables AS purchasables ON purchasables.id = lineitems.purchasableId
  JOIN craft_content AS content ON content.elementId = orders.id
  JOIN craft_usergroups_users AS usergroup_users ON usergroup_users.userId = users.id
  WHERE usergroup_users.groupId = 4
) AS X

【讨论】:

  • 感谢您的回复!我不完全确定如何处理这个查询。你能再解释一下吗?我应该用什么替换 X.X 吗?
  • 我通过从旧查询中添加一些语句来运行查询,但出现此语法错误。 'MAX(IF(purchasables.sku = '999992', lineitems.qty, NULL)) AS '999992',MAX(IF(pur' 有什么想法吗?
  • @Sanderfish - 我需要看看你正在运行什么查询,但听起来你的变量没有足够的空间来存储结果。
  • 我已将查询和错误消息添加到我的原始帖子中。另外:我的原始查询中的 " 语法没有任何问题 - 只有在我使用 GROUP BY orders.id 时才开始出现错误
  • @Sanderfish -- 是的,我明白了,您仍然需要原始的第二条语句,我的代码只替换了第一个查询。 (第二条语句是以“set”开头的语句)
猜你喜欢
  • 1970-01-01
  • 2014-10-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-25
  • 2014-10-16
  • 2010-12-28
  • 2014-07-26
相关资源
最近更新 更多