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