0

こんにちは私はこのようなテーブルを持っています

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;
4

4 に答える 4

1

結果を取得する 1 つの方法は次のとおりです。

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 では、MAX 集計は実際には省略できますが、他の 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

別のアプローチ:

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
于 2013-01-19T06:20:42.977 に答える
0

Max を Group_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;

SQL フィドルのデモ

于 2013-01-19T05:56:35.920 に答える
0

これを試して:

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;

このSQL FIDDLE DEMOをチェックしてください

出力

| DT |   A |   B |
------------------
|  1 |   1 |   3 |
|  2 | 1.1 | 2.5 |
于 2013-01-19T06:02:16.447 に答える
0

それを試してみてください

    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 |
+------+-------------------+------+
于 2013-01-19T06:10:16.000 に答える