Оператор SQL SELECT, имена столбцов как значения из другой таблицы - PullRequest
3 голосов
/ 19 марта 2012

Я работаю над базой данных со следующей таблицей:

id  location
1   Singapore
2   Vancouver
3   Egypt
4   Tibet
5   Crete
6   Monaco

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

Результат запроса:

Singapore , Vancouver, Egypt, Tibet, ...
<                 values               >

Ответы [ 3 ]

3 голосов
/ 19 марта 2012

как мне создать запрос, который бы приводил к именам столбцов, подобным следующему, без записи их в запрос:

Даже с crosstab() (из расширение tablefunc ), вы должны указать имена столбцов.

За исключением случаев, когда вы создаете выделенную функцию C для вашего запроса.Расширение tablefunc обеспечивает основу для этого, хотя выходные столбцы (список стран) должны быть стабильными.Несколько дней назад я написал «учебное пособие» для аналогичного случая:

Альтернатива должен использовать CASE операторы, подобные этому:

SELECT sum(CASE WHEN t.id = 1 THEN o.ct END) AS "Singapore"
     , sum(CASE WHEN t.id = 2 THEN o.ct END) AS "Vancouver"
     , sum(CASE WHEN t.id = 3 THEN o.ct END) AS "Egypt"
       -- more?
FROM   tbl t
JOIN  (
    SELECT id, count(*) AS ct
    FROM   other_tbl
    GROUP  BY id
    ) o USING (id);

ELSE NULL является необязательным в выражении CASE. Руководство:

Если предложение ELSE опущено и условие не выполняется, результат будет нулевым.

Основы для обоих методов:

0 голосов
/ 11 марта 2016

Скрипт для команды SelectTopNRows из SSMS

drop table #yourtable;

create table #yourtable(id int, location varchar(25));

insert into #yourtable values
('1','Singapore'),
('2','Vancouver'),
('3','Egypt'),
('4','Tibet'),
('5','Crete'),
('6','Monaco');


drop table #temp;

create table #temp( col1 int );

Declare @Script as Varchar(8000);

Declare @Script_prepare as Varchar(8000);

Set @Script_prepare = 'Alter table #temp Add [?] varchar(100);'
Set @Script = ''

Select
  @Script = @Script + Replace(@Script_prepare, '?', [location])
From
  #yourtable 
Where
  [id] is not null

Exec (@Script);
ALTER TABLE #temp DROP COLUMN col1 ;

select * from #temp;
0 голосов
/ 19 марта 2012

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

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

Location | Count
---------+------
Singapore| 1
Vancouver| 0
Egypt    | 2  
Tibet    | 1
Crete    | 3
Monaco   | 0
...