2013-11-16 3 views
0

У меня есть база данных с вакансиями, компаниями и зарплатами, которые содержат суммы, которые каждая компания оплачивает сотрудникам в каждой задаче. Каждая компания, работа и зарплата связаны с опросом. Я хотел бы что-то выход для обследования, чтобы выглядеть следующим образом:Как создать кросс-таблицу MySQL с NULL

|  |Company A|Company B|Company C| 
+------+---------+---------+---------+ 
|Job A | 34000 | 36750 | 41000 | 
|Job B | 65880 |   | 67000 | 
|Job C |   | 52340 | 49000 | 

пустые клетки являются те, где нет никаких записей в таблице Зарплаты соответствие компании к работе.

У меня возникли проблемы с пониманием примеров кросс-таблицы, которые я видел в Интернете. Я думаю, что я должен создать набор данных, который включает в себя строку для каждой комбинации, в том числе нулей, как это:

Company A | Job A | 34000 
Company A | Job B | 65880 
Company A | Job C | NULL 
Company B | Job A | 36750 
Company B | Job B | NULL 
Company B | Job C | 52340 
Company C | Job A | 41000 
Company C | Job B | 67000 
Company C | Job C | 49000 

Я бег этого запроса для создания вышеуказанных строк, и это работает нормально:

SELECT C.companyname, J.jobtitle, S.salary FROM Companies C INNER JOIN Jobs J 
    ON (C.surveyid=J.surveyid) LEFT JOIN Salaries S 
    ON (J.jobid=S.jobid and C.companyid=S.companyid) 
    ORDER BY C.companyname, J.jobtitle 

Вы можете увидеть здесь: http://sqlfiddle.com/#!2/91e49/12/0

Теперь, когда я получаю правильные данные, как я превратить это в кросс-таблице?

+1

Можете ли вы установить [SQL Fiddle] (http://sqlfiddle.com/) с образцовыми наборами данных? Если вы хотите включить значения «NULL», они просто должны быть «LEFT JOIN» на ненулевом значении. – doublesharp

+0

Так что, возможно, я недопонимаю «ЛЕВАЯ ВСТУПЛЕНИЕ» вообще - я хочу, чтобы там были значения NULL, когда в таблице зарплат нет соответствующей записи. Я пойду проверить SQL Fiddle ... Я только когда-либо использовал JS Fiddle, поэтому я предполагаю, что это похоже. – iopener

+0

@iopener. , , Я смущен тем, что вы просите. Ваш вопрос касается перекрестной закладки. Ваш запрос и последующие комментарии касаются недостающих строк в соединениях. Можете ли вы предоставить некоторые примеры данных и желаемый результат? –

ответ

1

Вы можете создать кросс-вкладку явно, используя агрегацию после объединения таблиц вместе. Это использует условную агрегацию (то есть case операторов, вложенных в функции агрегации).

Следующая работает, когда вы знаете названия мест для столбцов:

SELECT C.companyname, 
     max(case when jobtitle = 'Job A' then S.salary end) as JobA, 
     max(case when jobtitle = 'Job B' then S.salary end) as JobB, 
     max(case when jobtitle = 'Job C' then S.salary end) as JobC 
FROM Companies C INNER JOIN 
    Jobs J 
    ON C.surveyid = J.surveyid JOIN 
    Salaries S 
    ON J.jobid = S.jobid and C.companyid = S.companyid 
GROUP BY C.companyname; 

Если вы хотите написать что-то более общее, что читает названия работы из Jobs таблицы, то вы должны построить запрос как строку, и использовать инструкцию make для ее выполнения.

+0

Спасибо, Гордон, это имеет смысл. На самом деле я должен учитывать неизвестные/динамические названия, поэтому мне придется идти по маршруту подготовки. Поскольку это первое задание для спешки, я на данный момент пытался просто извлечь мои результаты из первого запроса и экспортировать его в Excel, а затем составить сводную таблицу с этими результатами. Я буду использовать ваш совет для создания общего решения. Благодаря! – iopener

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