sql查询问题

sql查询问题,sql,Sql,这个查询有什么问题?它们各自独立工作,但在我编写select之后就不工作了* 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(

这个查询有什么问题?它们各自独立工作,但在我编写select之后就不工作了*

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语句是这样的: 选择银行计数、保险计数、经济计数
我认为一个联合可能会解决我的问题,但这没有多大意义…

在子句中使用
而不是
联合
,如下所示:

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
方法,您只需要从第一个查询中获取名为的列,因此,既然这已经过去了,您最好在单个查询中完成:)


对于您更新的问题:这取决于您正在使用的数据库,但类似于
案例
语句的语句会起作用:

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

或者,如果你有一个描述表,你可以加入它,它会变得更干净/更易于维护…有几种方法可以解决这个问题,我不确定你的选项或平台是什么。

子句中使用
而不是
联合,如下所示:

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
方法,您只需要从第一个查询中获取名为的列,因此,既然这已经过去了,您最好在单个查询中完成:)


对于您更新的问题:这取决于您正在使用的数据库,但类似于
案例
语句的语句会起作用:

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

或者,如果你有一个描述表,你可以加入它,它会变得更干净/更易于维护…有几种方法可以解决这个问题,我不确定你的选项或平台是什么。

我认为你发布的查询的具体问题是你需要括号:

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

我认为您发布的查询的具体问题是您需要括号:

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

使用UNION,将两个结果集追加到一个表中。大多数SQL实现都希望联合在一起的每个集合中的列具有相同的名称。在您的情况下,将INSU_cnt和BANK_cnt的名称更改为通用名称(可能是“cnt”),将保险和银行的名称也更改为通用名称

或者,还有unioncorrect,它通过为不同的列名创建单独的列来处理不同的列名,但我认为这不是您想要的


如果这没有帮助,也许可以发布从日志中得到的错误。

使用UNION,将两个结果集附加到一个表中。大多数SQL实现都希望联合在一起的每个集合中的列具有相同的名称。在您的情况下,将INSU_cnt和BANK_cnt的名称更改为通用名称(可能是“cnt”),将保险和银行的名称也更改为通用名称

或者,还有unioncorrect,它通过为不同的列名创建单独的列来处理不同的列名,但我认为这不是您想要的


如果这样做没有帮助,也许可以发布您从日志中得到的错误。

这是应该的

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

这就是它应该是的

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


我知道我可以用一次选择来获取数据,但问题是我想单独获取表中的每一行,所以我想我可以用UNION指令来实现……即使使用一次选择,也会得到两行,所以UNION没有意义,当您已经限制了where子句中的结果集时,group by也没有,我知道我可以通过一次选择获取数据,但问题是我想单独获取表中的每一行,所以我想我可以通过UNION指令来实现……即使使用一次选择,也会得到两行,因此UNION没有意义,当您已将结果集限制在where中时,组也不会被删除clause@sasfrog:你确定吗?我认为MySQL在联合后忽略了表上的列名称。大多数系统都不是这样,它们希望列中的类型相同,并且大多数使用联合中第一个查询的名称。@Mark&@Nick:你说得对-很好。也许我想到的是用户,而不是SQL实现,他们期望某些行为…:)@萨斯福格:你确定吗?我认为MySQL在联合后忽略了表上的列名称。大多数系统都不是这样,它们希望列中的类型相同,并且大多数使用联合中第一个查询的名称。@Mark&@Nick:你说得对-很好。也许我想到的是用户,而不是SQL实现,他们期望某些行为…:)通过一个查询,我可以获得我需要的所有信息,但我想要的是每一行中单独的信息。例如,我得到:第1行:银行20第2行:保险10。。。。我希望查询返回bank_cnt(20),ins_cnt(10)。。。我该怎么做?@MNA:你想把结果作为字符串?您的评论也很难阅读,因为格式被弄乱了。@MNA:我把您的评论重读了好几遍,终于弄明白您需要什么了。你还想得到这个问题的答案吗?或者你已经找到了解决方案吗?@Mark:Nick的解决方案不能解决我的问题,因为我需要每个计数都有一个不同的名称。。。我以后需要在sql报告中使用它们。@MNA:对不起,我已经多次更改了答案。每次我读到你的问题,我都会用一种新的方式来解释。将来,如果您在问题中尽可能多地清楚地包含以下内容,这将有很大帮助:用文字描述问题、表结构、示例输入数据(数据库中每个表5-10行)、给出的示例数据的预期结果、编写查询的尝试、错误的结果。然后我想你会很快得到一个答案,你可以使用。一个查询我可以得到我需要的所有信息,但我想要的是什么