сложный динамический SQL-запрос, присоединение к себе

Я ищу решение сложного SQL-запроса. Я был бы признателен за некоторые советы о том, как выполнить этот относительно сложный SQL-запрос к таблице.

В настоящее время у меня есть следующая таблица:

caseId scanId attribute
-----------------------
  1      2       A
  1      4       A
  2      3       B
  3     NULL    NULL

Я хочу иметь возможность достичь этой таблицы:

caseId scanId1 scanId2 attribute1 attribute2 count
--------------------------------------------------
  1       2       4        A          A        2
  2       3      NULL      B        NULL       1
  3     NUL      NULL     NULL      NULL       0

Я знаю, что это включает в себя присоединение к самой таблице, однако я не могу придумать, как динамически сделать требуемое количество столбцов (scanId1, scanId2 и т. д.), которое зависит от количества уникальных кортежей caseId.

Любые советы о том, как я могу заставить это работать?

Заранее спасибо!


person BearAttack    schedule 20.11.2014    source источник
comment
Google: динамическая сводка MySQL. Если у вас есть динамическое количество столбцов, вам нужно использовать оператор prepare/execute, и на эту тему есть множество хороших ответов.   -  person Gordon Linoff    schedule 20.11.2014
comment
Жаль, что у вас нет доступного уровня представления (например, PHP)   -  person Strawberry    schedule 20.11.2014
comment
@Gordon - поиск динамической сводки MSSQL возвращает вас к переполнению стека здесь...   -  person 576i    schedule 20.11.2014
comment
спасибо, я использую эти запросы с PHP, поэтому я смог обрабатывать данные таким образом, а не пытаться создать сводную таблицу с самим mySQL.   -  person BearAttack    schedule 21.11.2014


Ответы (1)


Вы можете попробовать это. Оно работает

SELECT
    caseId,
    MAX(CASE WHEN scanId IN (2,3) THEN scanId ELSE NULL END) AS scanId1,
    MAX(CASE WHEN scanId=4 THEN scanId ELSE NULL END ) AS scanId2,
    MAX(CASE WHEN attribute =('A', 'B')THEN attribute ELSE NULL END) AS attribute1,
    MAX(CASE WHEN attribute IN ('A') THEN attribute ELSE NULL END ) AS attribute2,    
    count(scanId) AS counts    
FROM 
    GGG    
GROUP BY
    caseId
person Rohan Nayak    schedule 28.04.2015