2010-08-15 108 views
0

這個查詢有什麼問題?他們每個人獨立工作,但之後我寫SELECT *sql查詢問題

select * from 
(SELECT  COUNT(issuer_id) AS INSU_cnt, min_desc AS INSURANCE 
FROM   issuer INNER JOIN code ON economy_sect = cod_id 
WHERE  (min_desc = 't') 
GROUP BY min_desc) 
UNION 
(SELECT  COUNT(issuer_id) AS Bank_cnt,min_desc AS BANKS 
FROM   issuer INNER JOIN code ON economy_sect = cod_id 
WHERE  (min_desc = 'b') 
GROUP BY min_desc 
) 

編輯他們不工作: 我想這個問題是我有所有我想在一個表中的數據(與查詢)和我想從表中選擇5行...... 我有這個表:

Name  Count 
Bank  20 
Insurance 10 
Econ  10 

,我想SELECT語句是這樣的: 選擇bank_count,insurance_count,econ_count 我以爲工會可能會解決我的問題,但它沒有多大意義...

+0

我知道我可以用一個選擇獲取數據,但問題是,我想單獨表的每一行,所以我想我可以使用UNION做指令... – MNA 2010-08-15 10:19:57

+0

什麼是錯誤? – 2010-08-15 10:22:33

+2

什麼是數據庫引擎? – gbn 2010-08-15 10:35:18

回答

2

取而代之的是UNION,使用IN條款,如:

SELECT COUNT(issuer_id) AS Count, min_desc 
FROM issuer INNER JOIN code ON economy_sect = cod_id 
WHERE min_desc IN('t', 'b') 
GROUP BY min_desc 

隨着UNION方法,你只是要得到第一個查詢命名反正列,所以因爲這是已經走了你不妨做一個單一的查詢:)


爲您更新的問題:這個因人而異根據你使用的數據庫,但就像一個CASE聲明將工作:

SELECT (CASE min_desc WHEN 't' THEN 'Insurance' 
         WHEN 'b' THEN 'Bank' 
         WHEN 'e' THEN 'Econ' 
         ELSE 'Other' 
     End) as Name, COUNT(issuer_id) AS Count 
FROM issuer INNER JOIN code ON economy_sect = cod_id 
WHERE min_desc IN('t', 'b') 
GROUP BY min_desc 

或者,如果你有一個描述表,你可以加入到它變得更清潔/更易於維護的......有幾種方法可以解決這個問題,我不知道你的選擇或平臺是。

+0

+1以避免聯合時,這個組也沒有。 – 2010-08-15 10:29:09

+0

+1爲避免結合。將COUNT(issuer_id)AS Count'改爲'CASE min_desc WHEN't'THEN COUNT(issuer_id)ELSE 0 END AS Insu_Cnt,CASE min_desc WHEN'b'THEN COUNT(issuer_id)ELSE 0 END AS Bank_Cnt'將給出單獨的列銀行和保險價值,按照MNA的要求。 – 2010-08-16 11:27:54

2

我想與您發佈查詢的具體問題是,你需要括號:

SELECT * FROM (
    (
     SELECT COUNT(issuer_id) AS INSU_cnt, min_desc AS INSURANCE 
     FROM  issuer INNER JOIN code ON economy_sect = cod_id 
     WHERE  min_desc = 't' 
     GROUP BY min_desc 
    ) 
    UNION 
    (
     SELECT COUNT(issuer_id) AS Bank_cnt, min_desc AS BANKS 
     FROM  issuer INNER JOIN code ON economy_sect = cod_id 
     WHERE  min_desc = 'b' 
     GROUP BY min_desc 
    ) 
) T1 

但是這個查詢實際上不是你想要做什麼。你真正想要做的是:

SELECT 
(
    SELECT COUNT(issuer_id) 
    FROM issuer INNER JOIN code ON economy_sect = cod_id 
    WHERE min_desc = 't' 
) AS ins_cnt, 
    SELECT COUNT(issuer_id) 
    FROM issuer INNER JOIN code ON economy_sect = cod_id 
    WHERE min_desc = 'b' 
) AS bank_cnt 
+0

有一個查詢我可以得到我需要的所有信息,但我想要的是每行中的信息分開。 例如我得到: ROW1:銀行20分 2行:保險10 .... ,我想查詢返回bank_cnt(20),ins_cnt(10),...... 我該怎麼辦這個? – MNA 2010-08-15 10:33:25

+0

@MNA:你想要一個字符串的結果?你的評論也很難閱讀,因爲格式化搞砸了。 – 2010-08-15 10:39:20

+0

@MNA:我多次重讀你的評論,最後想出你需要什麼。您是否仍然有興趣接收這個問題的答案,或者您是否已經找到解決方案? – 2010-08-15 10:49:08

0

使用UNION,您將兩個結果集追加到一個表中。大多數SQL實現將期望來自每個集合的列在UNION中一起具有相同的名稱。在你的情況下,將INSU_cnt和BANK_cnt的名稱更改爲通用(可能是'cnt'),將INSURANCE和BANK更改爲通用。

另外,還有UNION CORRESPONDING,它通過爲它們創建單獨的列來處理不同的列名稱,但我不認爲這就是你所追求的。

如果這沒有幫助,也許發佈您從日誌中獲得的錯誤。

+0

@sasfrog:你確定嗎?我認爲MySQL在UNION之後忽略了表上的列名。 – 2010-08-15 10:26:10

+1

對於* most *系統,這不是真的,它們期望在列中具有相同的*類型*,並且大多數使用聯合中的第一個查詢中的*名稱*。 – 2010-08-15 10:26:43

+0

@Mark&@Nick:你說得對 - 好點。也許我正在考慮用戶,而不是SQL實現,期待着某些行爲...... :) – sasfrog 2010-08-15 10:40:35

0

這是它應該是什麼

select count(issuer_id) as cnt, min_desc 
from issue inner join code on economy_sect = cod_id 
where min_desc in ('t', 'b') 
group by min_desc