0

Hi I have a table that looks like this

dt   ticker  open
1     A        1
1     B        3
2     A        1.1
2     B        2.5

I would need the result to look like

dt    A        B
1     1        3
2     1.1      2.5

My current query I have included below gets me

dt    A        B
1     1        NULL
1     NULL     3
2     1.1      NULL
2     NULL     2.5

if anyone could help me out that would be very much appreciated

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;
1
  • similar question is here. Check it out. Commented Jan 19, 2013 at 6:11

4 Answers 4

1

One way to get the result would be:

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

(In MySQL the MAX aggregate can actually be omitted, thought an aggregate is required in other DBMS.)

SELECT t.dt
     , IF(t.ticker='A',t.open,NULL) AS A
     , IF(t.ticker='B',t.open,NULL) AS B
  FROM mytable t
 GROUP BY t.dt

Another approach:

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
Sign up to request clarification or add additional context in comments.

Comments

0

You need to add Max to your Group_Concat, Try this

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;

SQL Fiddle Demo

Comments

0

try it

    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;

result

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

Comments

0

Try this:

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;

Check this SQL FIDDLE DEMO

OUTPUT

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

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.