2012-03-18 2 views
3

Je travaille sur une base de données qui a le tableau suivant:instruction SQL SELECT, les noms de colonnes en tant que valeurs d'une autre table

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

Ma question est, comment puis-je produire une requête de ce qui entraînerait les noms de colonnes comme les suivantes, sans les écrire dans la requête:

résultat de la requête:

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

Ce n'est pas possible, et à mon avis, il est aussi une indication que vous êtes essayer de faire quelque chose dans le mauvais sens. Quel est votre problème * réel *? – Jon

+0

Je dois produire un compte du nombre de références à chaque emplacement dans une autre table, dans la sortie de ma requête. Les noms de colonnes doivent être précédés du nom de l'emplacement. – user1277546

+0

Donc, vous voulez interroger une autre base de données? Si oui, comment ce que vous avez dans * cette * base de données est-il pertinent? – Jon

Répondre

0

Vous pouvez le faire avec une dynamique vraiment sql déconner mais je ne le recommanderais pas.

Cependant, vous pouvez produire quelque chose comme ci-dessous, laissez-moi savoir si cette structure est acceptable et je vais poster quelques sql.

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

Malheureusement non, j'ai besoin de quelque chose qui produit les noms de lieux en tant que vedettes et leurs comptes respectifs en tant que valeurs. – user1277546

3

comment puis-je produire une requête qui entraînerait des noms de colonnes comme le suivant sans les écrire dans la requête:

Même avec crosstab() (du tablefunc extension), vous avoir à épeler les noms des colonnes. Sauf, si vous créez une fonction C dédiée pour votre requête. L'extension tablefunc fournit un cadre pour cela, les colonnes de sortie (la liste des pays) doivent être stables, cependant. J'ai écrit un "tutoriel" pour un cas similaire il y a quelques jours:

Le alternatif est d'utiliser CASE déclarations comme ceci:

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 est facultatif dans une expression CASE. The manual:

Si la clause ELSE est omise et aucune condition est vraie, le résultat est nul.

Principes de base pour les deux techniques:

0

Script pour SelectTopNRows commande de 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

cela fera exactement ce que vous cherchez. –

+0

Cela ne marchera pas sur Postgres –

Questions connexes