【问题标题】:setting a column name dynamically in a subquery在子查询中动态设置列名
【发布时间】:2015-01-12 11:48:38
【问题描述】:

我有 2 张桌子。一个叫 purchases

(id,月份,购买,storeid)

另一个叫 purchases_targets

(id, storeid, target1,target2, target3, target4, target5, target6, target7, target8, target9, target10, target11, target12)

purchasing_targets 中的列名对应于月份,即第 1 个月的目标 = target1。 规范化这不是我的选择!!! 我正在尝试做的事情类似于以下内容。

SELECT DISTINCT

    purchases.month,
    purchases.purchase, 
    CONCAT('target',purchases.month) AS column_name,
    (SELECT 
      column_name 
    FROM purchases_targets
    WHERE storeid = 1) AS 'target'

FROM purchases 
WHERE purchases.storeid = 1

注意上面 column_name 的使用。我已经尝试过了,结果总是为目标列返回目标+月份。我想知道是否有办法可以在 mysql 中完成这项工作。如果需要更多信息,请告诉我。谢谢

【问题讨论】:

  • PREPARE需要使用动态SQL,普通查询无法计算列名。
  • 我已经看到了您所说的示例,但所有示例都与子查询无关。在我的情况下,我将如何使用 PREPARE 方法。
  • 这似乎是一个设计不佳的架构。为什么不使用值从 1 到 12 的 month 列,而不是为月份设置单独的列?
  • 接手项目。我无法以任何方式更改列结构,因为有很多代码取决于列结构。

标签: mysql sql subquery calculated-columns


【解决方案1】:

您可以使用CASE 表达式根据month 选取不同的列:

SELECT DISTINCT
    p.month,
    p.purchase,
    CASE p.month
        WHEN 1 THEN pt.target1
        WHEN 2 THEN pt.target2
        ...
        WHEN 12 THEN pt.target12
    END AS target
FROM purchases AS p
JOIN purchases_targets AS pt ON p.storeid = pt.storeid
WHERE p.storeid = 1

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-01-07
    • 1970-01-01
    • 1970-01-01
    • 2010-10-13
    • 2018-12-01
    • 2018-01-12
    • 2012-11-11
    相关资源
    最近更新 更多