MYSQL在第一列中有值的两列如何进行内部联接

MYSQL在第一列中有值的两列如何进行内部联接,mysql,select,group-by,pivot-table,Mysql,Select,Group By,Pivot Table,嗨,我有一张像这样的桌子 dt ticker open 1 A 1 1 B 3 2 A 1.1 2 B 2.5 我需要结果看起来像这样 dt A B 1 1 3 2 1.1 2.5 我目前的问题,我已经包括在下面得到我 dt A B 1 1 NULL 1 NULL 3 2 1

嗨,我有一张像这样的桌子

dt   ticker  open
1     A        1
1     B        3
2     A        1.1
2     B        2.5
我需要结果看起来像这样

dt    A        B
1     1        3
2     1.1      2.5
我目前的问题,我已经包括在下面得到我

dt    A        B
1     1        NULL
1     NULL     3
2     1.1      NULL
2     NULL     2.5
如果有人能帮助我,我将不胜感激

SET @sql = NULL;
SELECT
  GROUP_CONCAT(DISTINCT
    CONCAT(
      '(IF(ticker = ''',
      ticker,
      ''', open, NULL)) AS ''',
      ticker,''''
    )
  ) INTO @sql
FROM
  prices;

SET @sql = CONCAT('SELECT dt, ', @sql, ' FROM prices');
-- SET @sql = CONCAT('SELECT dt, ', @sql, ' FROM prices GROUP BY dt');

  PREPARE stmt FROM @sql;
  EXECUTE stmt;

您需要将Max添加到您的组中。\u Concat,请尝试以下操作

SET @sql = NULL;
SELECT
  GROUP_CONCAT(DISTINCT
    CONCAT(
      'Max(case when ticker = ''',
      ticker,
      ''' then open end) AS ',
      replace(ticker, ' ', '')
    )
  ) INTO @sql
from prices;

SET @sql = CONCAT('SELECT x.dt, ', @sql, ' from prices x
group by x.dt');

PREPARE stmt FROM @sql;
EXECUTE stmt;
试试这个:

SELECT GROUP_CONCAT(CONCAT(" MAX(IF(ticker = '", ticker, "', open, NULL)) AS ", ticker)) INTO @sql
FROM prices;

SET @sql = CONCAT('SELECT dt, ', @sql, ' FROM prices GROUP BY dt'); 

PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
检查这个

输出

| DT |   A |   B |
------------------
|  1 |   1 |   3 |
|  2 | 1.1 | 2.5 |
试试看

    select a.dt,a.A,CASE WHEN ticker='B' THEN open END AS 'B' from (SELECT dt,CASE WHEN ticker='A' THEN open END AS 'A' FROM test group by dt) a inner join test using(dt) where CASE WHEN ticker='B' THEN open END  is not null;
结果

+------+-------------------+------+
| dt   | A                 | B    |
+------+-------------------+------+
|    1 |                 1 |    3 |
|    2 | 1.100000023841858 |  2.5 |
+------+-------------------+------+

获得结果的一种方法是:

SELECT t.dt
     , MAX(IF(t.ticker='A',t.open,NULL)) AS A
     , MAX(IF(t.ticker='B',t.open,NULL)) AS B
  FROM mytable t
 GROUP BY t.dt
(在MySQL中,虽然其他DBMS中需要聚合,但实际上可以省略MAX aggregate。)

另一种方法:

SELECT t.dt
     , t.open AS A
  FROM mytable t
  LEFT
  JOIN (SELECT s.dt
             , t.open AS B
          FROM mytable s
         WHERE s.ticker = 'B'
         GROUP BY s.dt
       ) b
    ON b.dt = t.dt
 WHERE t.ticker = 'A'
 GROUP BY t.dt
 ORDER BY t.dt
类似的问题也存在。过来看。
SELECT t.dt
     , t.open AS A
  FROM mytable t
  LEFT
  JOIN (SELECT s.dt
             , t.open AS B
          FROM mytable s
         WHERE s.ticker = 'B'
         GROUP BY s.dt
       ) b
    ON b.dt = t.dt
 WHERE t.ticker = 'A'
 GROUP BY t.dt
 ORDER BY t.dt