我正在它具有以下表的數據庫值:SQL SELECT語句中,列名從另一個表
id location
1 Singapore
2 Vancouver
3 Egypt
4 Tibet
5 Crete
6 Monaco
我的問題是,我怎麼能生產此這將導致查詢列名不一樣寫他們到查詢如下:
查詢結果:
Singapore , Vancouver, Egypt, Tibet, ...
< values >
我正在它具有以下表的數據庫值:SQL SELECT語句中,列名從另一個表
id location
1 Singapore
2 Vancouver
3 Egypt
4 Tibet
5 Crete
6 Monaco
我的問題是,我怎麼能生產此這將導致查詢列名不一樣寫他們到查詢如下:
查詢結果:
Singapore , Vancouver, Egypt, Tibet, ...
< values >
你能做到這一點有一些很搞亂動態SQL,但我不會推薦它。
然而,你可以產生像下面的東西,讓我知道如果該結構是可以接受的,我會發布一些SQL。
Location | Count
---------+------
Singapore| 1
Vancouver| 0
Egypt | 2
Tibet | 1
Crete | 3
Monaco | 0
不幸的是,我確實需要將位置名稱作爲標題和它們各自的計數值作爲值。 – user1277546 2012-03-18 23:55:32
我怎麼能生成查詢,這將導致列的名稱,如下面的 無需編寫他們進入查詢:
即使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
子句並且沒有條件爲真,則結果爲空。
基礎知識兩種技術:
的腳本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;
這將做你正在尋找的。 – 2016-03-11 15:55:59
這不適用於Postgres – 2016-03-11 16:42:52
命令這是不可能的,恕我直言,這也表明,你是試圖以錯誤的方式做事。什麼是你的*真實*問題? – Jon 2012-03-18 23:29:17
我需要在查詢的輸出中產生對另一個表中每個位置的引用數的計數。列名稱需要以位置名稱開頭。 – user1277546 2012-03-18 23:33:07
所以你想查詢另一個數據庫?如果是這樣,你在*這個數據庫中的相關性如何? – Jon 2012-03-18 23:34:17