Матричное представление, сгенерированное из двух выбранных столбцов таблицы

Предположим, у меня есть таблица, содержащая Project_type, Project_No, OS_Platform колонны. Здесь я ограничился Project_typeи ограниченный OS_Platforms. Я хочу, чтобы представление базы данных, которое производит матрицу между Project_type а также OS_Platform,

 MY_TABLE : 
 Project_Type     Project_No       OS_Platform 
 Drivers          345              Linux
 WebService       453              Windows                    
 Drivers          034              Windows            
 Drivers          953              Solaris
 DesktopApp       840              Windows 
 WebService       882              Solaris   

Теперь у меня есть Project_type а также OS_Platform как выбранные столбцы. Я хочу матричное представление этих двух столбцов с различными строками и именами столбцов.

Project_Type     Linux    Windows     Solaris
WebService       null      true         true
Drivers          true      true         true
DesktopApp       null      true         null

Может кто-нибудь сказать мне, если это возможно. Как это возможно?

3 ответа

Вы также можете попробовать использовать выделенную функцию PIVOT, если она поддерживается используемым вами продуктом SQL. Например, в SQL Server 2005+ будет работать следующее:

SELECT *
FROM (
  SELECT DISTINCT
    Project_Type,
    'true' AS flag,
    OS_Platform
  FROM MY_TABLE
) s
PIVOT (
  MAX(flag)
  FOR OS_Platform IN (
    Linux, Windows, Solaris
  )
) p
;

Oracle Database - еще один продукт, поддерживающий PIVOT, хотя я не уверен, в какой версии он был впервые представлен. Вы сможете выполнить вышеуказанный запрос в Oracle, заключив каждый столбец в списке IN PIVOT в одинарные кавычки, например так:

... IN (
  'Linux', 'Windows', 'Solaris'
)
...

Это в основном PIVOT запрос, где вы переносите свои строки данных в столбцы. Самый простой способ сделать это, так как вы хотите true/null значение использует агрегатную функцию и CASE заявление:

select project_type,
  max(case when os_platform ='Linux' then 'true' else null end) Linux,
  max(case when os_platform ='Windows' then 'true' else null end) Windows,
  max(case when os_platform ='Solaris' then 'true' else null end) Solaris
from yourtable
group by project_type

Смотрите SQL Fiddle с демо

Результат:

| PROJECT_TYPE |  LINUX | WINDOWS | SOLARIS |
---------------------------------------------
|   DesktopApp | (null) |    true |  (null) |
|      Drivers |   true |    true |    true |
|   WebService | (null) |    true |    true |

Вы захотите повернуть / отменить ваши значения, чтобы перенести их в ваш формат по вашему выбору.

Вот гугл поиск по стержню при переполнении стека. Любое из них вам подойдет. https://www.google.com/search?q=sql+pivot+unpivot+site%3Astackru.com&oq=sql+pivot+unpivot+site%3Astackru.com&aqs=chrome.0.57.9985&sugexp=chrome,mod=8&sourceid=chrome&ie=UTF-8

Теперь есть 2 типа ответов, которые вы увидите там. Первый - это обычная операция разворота / разворота. Они работают очень хорошо (легко, не быстро) с известными наборами данных. То есть, если вы знаете все типы проектов и платформ, это будет работать нормально.

Второй тип - это динамический свод или свод, созданный с использованием динамического SQL. Это сложнее, но позволяет вам любую комбинацию полей.

Удачи!

Другие вопросы по тегам