2010-08-15 112 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