2012-03-18 52 views
3

我正在它具有以下表的數據庫值:SQL SELECT語句中,列名從另一個表

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

我的問題是,我怎麼能生產此這將導致查詢列名不一樣寫他們到查詢如下:

查詢結果:

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

命令這是不可能的,恕我直言,這也表明,你是試圖以錯誤的方式做事。什麼是你的*真實*問題? – Jon 2012-03-18 23:29:17

+0

我需要在查詢的輸出中產生對另一個表中每個位置的引用數的計數。列名稱需要以位置名稱開頭。 – user1277546 2012-03-18 23:33:07

+0

所以你想查詢另一個數據庫?如果是這樣,你在*這個數據庫中的相關性如何? – Jon 2012-03-18 23:34:17

回答

0

你能做到這一點有一些很搞亂動態SQL,但我不會推薦它。

然而,你可以產生像下面的東西,讓我知道如果該結構是可以接受的,我會發布一些SQL。

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

不幸的是,我確實需要將位置名稱作爲標題和它們各自的計數值作爲值。 – user1277546 2012-03-18 23:55:32

3

我怎麼能生成查詢,這將導致列的名稱,如下面的 無需編寫他們進入查詢:

即使crosstab()(從tablefunc extension),你必須列出列名稱。

除了爲您的查詢創建專用的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表達式中可選。 The manual:

如果省略ELSE子句並且沒有條件爲真,則結果爲空。

基礎知識兩種技術:

0

的腳本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

這將做你正在尋找的。 – 2016-03-11 15:55:59

+0

這不適用於Postgres – 2016-03-11 16:42:52