2014-02-01 5 views
1

У меня есть mysql db, где у меня есть данные какой-то компании (ряд мудрый). Мне нужен отчет, который должен быть ежедневной транзакцией компании, где имена компаний должны отображаться как столбец и сумма в той же таблице, что и строки.Строка как столбец в MySQL

Отчет генерирует, но с нулевыми значениями.

Структура таблицы:

 
------------------------------------------ 
company_id | date | amount | party_id 
------------------------------------------ 
1000  | 1-1-14 | 10000 | 101 
1001  | 2-1-14 | 20900 | 102 
1001  | 2-1-14 | 20000 | 102 
1000  | 1-1-14 | 10000 | 101 
1000  | 2-1-14 | 21000 | 101 
------------------------------------------ 

Я хочу, чтобы отчет в следующем формате:

 
--------------------- 
1000 | 1001 | 1002 
--------------------- 
10000 | 20900 | NULL 
10000 | 20000 | NULL 
21000 | NULL | NULL 
--------------------- 

должен возвращать 3 строки.

Я использую это ниже упомянутый запрос:

SELECT 
     (CASE WHEN company_id = '1000' THEN transaction_amount END) `1000`, 
     (CASE WHEN company_id = '1001' THEN transaction_amount END) `1001`, 
     (CASE WHEN company_id = '1003' THEN transaction_amount END) `1002`, 
FROM table3; 

Но я получаю много строк с NULL.

 
--------------------- 
1000 | 1001 | 1002 
--------------------- 
10000 | NULL | NULL 
NULL | 20900 | NULL 
NULL | 20000 | NULL 
10000 | NULL | NULL 
21000 | NULL | NULL 
--------------------- 

запрос возвращает 5 строк.

Я пробовал order by, group by но без успеха. Пожалуйста, помогите мне.

+0

может u создайте скрипт sql! – developerCK

ответ

1

В исходном запросе вы не использовали GROUP BY, поэтому вы получаете в своем наборе результатов столько строк, сколько у вас в таблице.

Теперь проблема с GROUP BY была вызвана тем, что у вас нет столбца для группировки строк. Поэтому для получения желаемого результата вы можете ввести это, не exitent столбец - номер строки в каждом company_id упорядочены по дате

SELECT MAX(CASE WHEN company_id = 1000 THEN amount END) `1000`, 
     MAX(CASE WHEN company_id = 1001 THEN amount END) `1001`, 
     MAX(CASE WHEN company_id = 1002 THEN amount END) `1002` 
    FROM 
(
    SELECT t.*, 
     @n := IF(@c = company_id, @n + 1, 1) rnum, @c := company_id 
    FROM table1 t CROSS JOIN (SELECT @n := 0, @c := NULL) i 
    ORDER BY company_id, date 
) q 
GROUP BY rnum 

Выход:

 
| 1000 | 1001 | 1002 | 
|-------|--------|--------| 
| 10000 | 20900 | (null) | 
| 10000 | 20000 | (null) | 
| 21000 | (null) | (null) | 

Вот SQLFiddle демо

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