Матричное представление, сгенерированное из двух выбранных столбцов таблицы
Предположим, у меня есть таблица, содержащая Project_type
, Project_No
, OS_Platform
колонны. Здесь я ограничился Project_type
и ограниченный OS_Platform
s. Я хочу, чтобы представление базы данных, которое производит матрицу между 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. Это сложнее, но позволяет вам любую комбинацию полей.
Удачи!