2013-10-27 3 views
0

У меня есть суперпростой запрос SELECT TIME, VALUE, TYPE from mylog;MySQL выбрать в одной строке значения из другой строки

Мой запрос показать следующее:

| TIME   | VALUE |  TYPE | 
------------------------------------- 
| 2013-09-26 04:45| 18.7 |   1 | 
| 2013-09-26 04:45| 84.5 |   2 | 
| 2013-09-26 05:00| 18.6 |   1 | 
| 2013-09-26 05:00| 84.7 |   2 | 

Но я хочу запрос показать следующее:

| TIME   | VALUE A | VALUE B | 
---------------------------------------- 
| 2013-09-26 04:45| 18.7 | 85.5  | 
| 2013-09-26 05:00| 18.6 | 84.7  | 

где VALUE A является Type = 1 и VALUE B является Type = 2

Все данные хранятся в всего один стол и содержит столбцы:

TIME, VALUE, TYPE 

ответ

1
SELECT 
    `TIME`, 
    MIN(IF(`TYPE`=1,`VALUE`,99999999)) AS `Value A`, 
    MIN(IF(`TYPE`=2,`VALUE`,99999999)) AS `Value B` 
FROM mylog 
GROUP BY `TIME` 

с 99999999 не menaing "никакой ценности доступных"

EDIT

я не буду использовать NULL, как он будет отрицать, меня больше MIN (или MAX). Если вы хотите NULL вместо этого, вы должны wraop это в

SELECT `TIME`, 
    IF(`Value A`=99999999,NULL,`Value A`), 
    IF(`Value B`=99999999,NULL,`Value B`) 
FROM (
    -- ... 
) AS baseview 
+0

Почему 99999999, а не 0 или NULL, когда есть «нет значения», как и следовало бы, вы можете уточнить, почему вы выбираете 99999999 ?? –

+0

99999999 и 0 - это что-то вроде того же - я не знал, если отрицательные значения могут произойти, поэтому я выбрал «off scale high» в качестве маркера. NULL не будет работать с 'MIN' или' MAX'. Смотрите мое редактирование! –

+0

+1 за объяснение пропустили вашу точку там –

1
SELECT TIME, 
MIN(CASE WHEN TYPE= '1' THEN VALUE ELSE NULL END) AS VALUE_A, 
MIN(CASE WHEN TYPE= '2' THEN VALUE ELSE NULL END) AS VALUE_B From mylog GROUP BY time 

SQL fiddle

+0

он не работает, он показывает значения альтернатив – ManuParra

+1

+1, но все еще случай, когда TYPE = «1» должен быть случай, когда TYPE = 1, чтобы избежать литья .. –

Смежные вопросы