отредактировано, после комментариев SONewbie
Должно соответствовать ANSI:
SELECT
ID1,
MAX(CASE WHEN Name = 'item_name' THEN Value ELSE NULL END) AS item_name,
MAX(CASE WHEN Name = 'item_price' THEN Value ELSE NULL END) AS item_price,
MAX(CASE WHEN Name = 'animal_name' THEN Value ELSE NULL END) AS animal_name,
MAX(CASE WHEN Name = 'animal_gender' THEN Value ELSE NULL END) AS animal_gender
FROM tbl
GROUP BY ID1, ID2;
Это не даст желаемого результата - вместо этого результат будет выглядеть следующим образом:
==============================================================
| ID1 | item_name | item_price | animal_name | animal_gender |
==============================================================
| 16 | Toys | 55 | dog | male |
| 18 | Toys | 55 | dog | male |
| 16 | Computer | 200 | cat | female |
| 18 | Computer | 200 | cat | female |
--------------------------------------------------------------
Это потому, что ID1 и ID2 связывают кошку и самку с компьютером и только 200, а те же поля связывают собаку и самца с игрушками и только 55. Группировка по ID3 вводит много NULL, поскольку ID1 и ID3 вместе однозначно идентифицируют строки данных.