0

我有这张价格表

type | year | price
===================
A    | 2002 | 200
B    | 2002 | 120
C    | 2002 | 126
B    | 1999 | 100
A    | 2004 | 202
A    | 2005 | 206

我需要一个SELECT查询来生成二维类型的价格数组,A并且B在它们出现的每一年中,NULL如果没有给定类型的数据。

year | price A | price B
========================
1999 | NULL    | 100
2002 | 200     | 120
2004 | 202     | NULL
2005 | 206     | NULL
4

2 回答 2

2

这基本上是一个PIVOT但 MySQL 没有函数,因此您可以使用带有聚合函数的语句PIVOT来复制它。CASE如果您有已知数量的type值,则可以对这些值进行硬编码:

select year,
  avg(case when type='A' then price end) PriceA,
  avg(case when type='B' then price end) PriceB
from yourtable
group by year

请参阅带有演示的 SQL Fiddle

结果:

| YEAR | PRICEA | PRICEB |
--------------------------
| 1999 | (null) |    100 |
| 2002 |    200 |    120 |
| 2004 |    202 | (null) |
| 2005 |    206 | (null) |

如果您的数量未知,types则可以使用准备好的语句:

SET @sql = NULL;
SELECT
  GROUP_CONCAT(DISTINCT
    CONCAT(
      'avg(case when type = ''',
      type,
      ''' then price end) AS Price',
      type
    )
  ) INTO @sql
FROM yourtable;

SET @sql = CONCAT('SELECT year, ', @sql, ' 
                  FROM yourtable 
                   GROUP BY year');

PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;

请参阅带有演示的 SQL Fiddle

于 2012-11-27T16:03:20.250 回答
1

回答评论


以下答案仅回答 PIVOT - OP 问题 的一部分由于它没有使用任何聚合函数,因此该查询没有提供对计数 OP 预期输出的完整答案。

检查参考:)

SQLFIDDLE

询问:

SELECT t.year,
         (CASE WHEN t.type = 'A' 
               THEN PRICE ELSE NULL END) AS price_a,
         (CASE WHEN t.type = 'B' 
               THEN PRICE ELSE NULL END) AS prioce_b         
FROM tbl t
GROUP BY t.year
;

结果:

YEAR    PRICE_A     PRIOCE_B
1999    (null)     100
2002    200       (null)
2004    202       (null)
2005    206       (null)
于 2012-11-27T16:10:10.023 回答