istudent Ответов: 2

Как спроецировать 3 разных столбца из 3 строк без создания временной таблицы?


Как спроецировать 3 разных столбца из 3 строк без создания временной таблицы?

В моей таблице у меня есть 3 столбца типа имени, идентификатора и значения.

столбец "тип" содержит записи "myapp" во всех 3 строках.

столбец "идентификатор" имеет запись "владелец приложения" в первой строке.
колонка "идентификатор" имеет запись приложение-дев' во второй строке.
колонка "идентификатор" имеет запись приложение-тестер в третьем ряду.

столбец "значение" имеет запись "владелец" в строке 1.
столбец "значение" есть запись 'Дев' в строке 2.
столбец "значение" имеет запись "тестер" в строке 3.

Как написать запрос, чтобы я мог получить данные обратно со столбцами "владелец", " Дев " и "тестер" со значениями "владелец", " Дев " и "тестер"?

Что я уже пробовал:

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

Самостоятельное соединение может привести к результату, но является ли это эффективным способом сделать это, когда таблица содержит много записей?

Select TOP(1) a.app-owner as 'Owner', b.app-dev as 'Dev', c.app-tester as 'Tester FROM myTable m
JOIN myTable a on a.type = m.type and a.identifier = 'app-owner'
JOIN myTable b on b.type = m.type and b.identifier = 'app-dev'
JOIN myTable c on c.type = m.type and c.identifier = 'app-tester'

MadMyche

Пожалуйста, используйте Improve Question виджет и надстройка-это то, как вы ожидаете, что результирующий набор будет выглядеть.

istudent

Я хочу проецировать значения из трех строк, как в трех разных столбцах. Я не знаю, как создать таблицу, о которой идет речь, чтобы я мог показать вам. Я действительно присоединился к себе, и я могу получить результат, но есть ли эффективный способ сделать это?

2 Ответов

Рейтинг:
1

Richard Deeming

Что-то вроде этого может сработать:

SELECT
    [type],
    MAX(CASE identifier WHEN 'app-owner' THEN value END) As Owner,
    MAX(CASE identifier WHEN 'app-dev' THEN value END) As Dev,
    MAX(CASE identifier WHEN 'app-tester' THEN value END) As Tester
FROM
    myTable
GROUP BY
    [type]
;


Рейтинг:
0

MadMyche

Похоже, вы хотите использовать что-то вроде СТЕРЖЕНЬ[^] функция, которая находится в SQL Server или Excel.
Это дало бы результат примерно такой

ColumnRow     AppOwner   AppDev   AppTester
============  =========  =======  =========
Column Title  The Owner  The Dev  The Tester
Из этого запроса
DECLARE @Temp TABLE (
   Type       INT ,
   Identifier NVARCHAR(16) ,
   Value      NVARCHAR(16)
)

INSERT @Temp VALUES
  (1, 'app-owner', 'The Owner')
, (2, 'app-dev', 'The Dev')
, (3, 'app-tester', 'The Tester')

SELECT ColumnRow = 'Column Title'
     , AppOwner  = [App-Owner]
     , AppDev    = [App-Dev]
     , AppTester = [App-Tester]

FROM  (  SELECT [Value], Identifier
         FROM @Temp
) as S
PIVOT  ( Max([Value])
         FOR [Identifier]
         IN  ([App-Owner], [App-Dev], [App-Tester])
) as P
Теперь, если это то, что вы хотите, и вы используете другую версию SQL (например, MySql), вам нужно будет искать аналогичные функции в зависимости от того, что использует ваша база данных (например, MySql PIVOT), и подобные скрипты представятся вам
Примечание:
Когда вы посмотрите на этот код здесь (или в SQL IDE), вы заметите, что некоторые имена столбцов (тип, значение) имеют другой цвет в объявлении таблицы и также заключены в [квадратные скобки] в запросе. Это происходит потому, что они являются зарезервировано/специальное предложение слова во многих серверах баз данных. Как правило, рекомендуется переименовать эти столбцы, чтобы предотвратить путаницу для разработчиков или выполняемых запросов


istudent

- Спасибо, сэр. Но я не хочу создавать временную таблицу.

MadMyche

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