mysql - 在子查询中动态设置列名

标签 mysql sql subquery calculated-columns

我有两张 table 。一个名为购买,其中

(id, month, purchase, 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 中完成这项工作。如果需要更多信息,请告诉我。谢谢

最佳答案

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

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

关于mysql - 在子查询中动态设置列名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27901290/

相关文章:

php - 以下查询可能会导致并发事务死锁吗?

MYSQL查询错误

mysql - 在不删除的情况下获取重复计数

SQL NOT IN 可能存在性能问题

mysql - 为另一列中的每个值选择不同的列,然后分组

php - pdo mysql 与 php 循环仅返回 1 行

php - 无法运行查询 : SQLSTATE[23000]: Integrity constraint violation: 1048 Column 'membersince' cannot be null

java - 将java时间戳与sql时间戳相匹配?

sql - 在 db2 中优化查询

oracle - 如何重用子查询