【问题标题】:Pivot MySQL Table透视 MySQL 表
【发布时间】:2017-06-29 14:09:04
【问题描述】:

我一直在尝试在 MySQL 中对表进行透视(将行移动到列)。我了解 mysql 没有枢轴功能,所以我认为需要联合但不是 100% 确定。我有三列,user_id、option_id 和 question_id。我需要将所有 user_id 分组,并将所有 option_ids 放在一行中,其中 question_ids 作为列:

我有SELECT user_id, option_id, question_id FROM table,它给了我以下输出:

+----------+-------------+--------------+
| user_id  | option_id   | question id  |
+----------+-------------+--------------+
| 101      | A1          | Q1           |
| 101      | A5          | Q2           |
| 102      | A2          | Q1           |
| 102      | A7          | Q2           |
+---------------------------------------+

我需要有以下输出:

+----------+-------------+--------------+
| user_id  | Q1          | Q2           |
+----------+-------------+--------------+
| 101      | A1          | A5           |
| 102      | A2          | A7           |
+---------------------------------------+`

我尝试过使用case,但这只会给我第一行的 user_id 并且我得到其余列的“null”

提前感谢您的帮助。

【问题讨论】:

  • 这里的端点是什么?因为这可以通过另一种方式完成,但如果你解释一下它最终需要做什么会很好。你将使用哪种编程语言来处理这个,
  • 我在 PHP 中处理这个问题,该表本质上可能有数千个 question_id 和 answer_id 的组合,但 user_id 和 question_id 的组合永远只有一种。
  • 我最初是在做一个通用的选择并在 PHP 中执行逻辑来组织表格,但是对于大量数据来说,对我的应用程序服务器的影响太大了。似乎如果我能找出一个 SQL 查询来实现这一点,那么我的数据库服务器就可以接受了
  • 你的问题是你没有很好地组织你的项目。你必须以另一种方式来构建你的数据库并以正确的方式重写你的代码。你有一些文档吗?或者有什么地方可以让我更好地了解这个项目?
  • 只是为了确认您需要问题形式作为范围的起点?所以基本上您可以拥有 Qn?

标签: mysql database pivot transpose


【解决方案1】:

我有一个请求,要创建一些简单雨数据的平面视图。数据在一个只有 3 列(字段)的表中,即 'dDate'、'mm'、'cmets'。

我需要转置/透视数据以将其放入用户的 Web 表中。

这就是我最终得到的(作为程序),并认为它可以帮助您构建查询或程序以满足您的需求。

CREATE DEFINER=`xxxx`@`localhost` PROCEDURE `p_GetYearRainTable`(IN yr 
CHAR(4), IN Tot Char(4))
BEGIN
SELECT 
dDay,
SUM(mJan) AS 'Jan',
SUM(mFeb) AS 'Feb',
SUM(mMar) AS 'Mar',
SUM(mApr) AS 'Apr',
SUM(mMay) AS 'May',
SUM(mJun) AS 'Jun',
SUM(mJul) AS 'Jul',
SUM(mAug) AS 'Aug',
SUM(mSep) AS 'Sep',
SUM(mOct) AS 'Oct',
SUM(mNov) AS 'Nov',
SUM(mDec) AS 'Dec'
FROM
    (SELECT 
    dDay,
        CASE WHEN dMnth = '1' THEN mm END AS 'mJan',
        CASE WHEN dMnth = '2' THEN mm END AS 'mFeb',
        CASE WHEN dMnth = '3' THEN mm END AS 'mMar',
        CASE WHEN dMnth = '4' THEN mm END AS 'mApr',
        CASE WHEN dMnth = '5' THEN mm END AS 'mMay',
        CASE WHEN dMnth = '6' THEN mm END AS 'mJun',
        CASE WHEN dMnth = '7' THEN mm END AS 'mJul',
        CASE WHEN dMnth = '8' THEN mm END AS 'mAug',
        CASE WHEN dMnth = '9' THEN mm END AS 'mSep',
        CASE WHEN dMnth = '10' THEN mm END AS 'mOct',
        CASE WHEN dMnth = '11' THEN mm END AS 'mNov',
        CASE WHEN dMnth = '12' THEN mm END AS 'mDec'
FROM
    (SELECT 
    id,
        DAY(dDate) AS dDay,
        MONTH(dDate) AS mnth,
        YEAR(dDate) AS yr,
        mm,
        comments,
        CASE
            WHEN MONTH(dDate) LIKE '1' THEN '1'
            WHEN MONTH(dDate) LIKE '2' THEN '2'
            WHEN MONTH(dDate) LIKE '3' THEN '3'
            WHEN MONTH(dDate) LIKE '4' THEN '4'
            WHEN MONTH(dDate) LIKE '5' THEN '5'
            WHEN MONTH(dDate) LIKE '6' THEN '6'
            WHEN MONTH(dDate) LIKE '7' THEN '7'
            WHEN MONTH(dDate) LIKE '8' THEN '8'
            WHEN MONTH(dDate) LIKE '9' THEN '9'
            WHEN MONTH(dDate) LIKE '10' THEN '10'
            WHEN MONTH(dDate) LIKE '11' THEN '11'
            WHEN MONTH(dDate) LIKE '12' THEN '12'
            ELSE NULL
        END AS dMnth
FROM
    t_rainData
WHERE
    YEAR(dDate) = yr) tab1
GROUP BY dDay , mJan , mFeb , mMar , mApr , mMay , mJun , mJul , mAug , mSep , mOct , mNov , mDec
ORDER BY dDay) S2
group by
case when Tot = 'Tot' then
   Tot else
   dDay    end
ORDER BY dDay
;
END

顺便说一句,您将看到该网站的提示的使用(非常感谢 René Nyffenegger,请参阅下面的 NB),该提示不仅允许我提供我想要的年份,而且还可以提供控制 GROUP BY 命令的参数在结束时的程序。

注意。显然,您不能支持现有的答案来向其他人确认有效或可用。我发布了对上述参考的答案,它立即被删除。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-03-10
    • 2020-08-28
    • 2018-04-21
    • 2023-04-08
    • 2023-03-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多