2016-06-23 343 views
1

我有多个查询,它只在一列中生成一个计数(仅一个单元格)。我需要结合这些列。将多个sql查询的结果合并到单独的多列中

假设查询是:

select count (*) from address where city = NULL as citycount; 
select count (*) from address where countrycode = 4 as countrycount; 
select count (*) from address; 

上面的查询将返回结果:

citycount 

40 

countrycount 

50 

count(*) 

400045 

我想上面查询,以这样的方式结合起来,这样的结果将是:

citycount countrycount count(*) 

    40  50   400045 

这意味着列将被合并。我有超过30个查询。 在此先感谢

+1

我不知道'城市= null'给你一个结果。 –

+0

您是否在使用Oracle(支持PL/SQL)或Informix(不支持Oracle的PL/SQL)? Informix(或标准SQL,AFAIK)不接受'= NULL'符号,因此您应该用Oracle标记问题(如PL/SQL标记描述中所暗示的那样),并且可能不使用Informix,除非您解释了您需要双语解决方案(在这种情况下,您不会使用'= NULL')。 –

+0

“COUNT(*) - COUNT(city)”表达式应该为您提供空城(“COUNT(column_name)”计数非空值的数量)。 –

回答

2

使用SUM与CASE表达式:

select 
    sum(case when city = NULL then 1 else 0 end) as citycount, 
    sum(case when countrycode=4 then 1 else 0 end) as countrycount, 
    count(*) as countt 
    from address 
+2

'城市IS NULL'? – jarlh

+0

这是根据用户查询,他可能已经设置了ansi nulls :) – TheGameiswar

+0

是Oracle/plsql还是Informix的行为? – jarlh

1
select 
(select count (*) from address where city IS NULL) as citycount, 
(select count (*) from address where countrycode = 4) as countrycount, 
count(*) 
from address 
+0

感谢弗拉德,我已经尝试过相同,它为2-3查询工作正常。但不适用于20-30个查询。我们可以有优化的方式 – app

+0

@app:这或多或少是必要的。如果您的聚合具有不同的过滤条件,那么您需要沿着这里的不同表达式来计算它们。或者你可以在另一个答案中使用CASE公式。查看查询计划会告诉你哪个是性能较好的变体 - 它将取决于优化器(并确保您有适当的索引等)。 –

0

尝试这样的事情......希望它有助于

CREATE TABLE #TEST 
(
ID INT IDENTITY(1,1) NOT NULL, 
Cnt INT NOT NULL, 
DescTableName VARCHAR(100) NULL 
) 

INSERT INTO #TEST (Cnt, DescTableName) 
SELECT COUNT(*) AS Cnt, 'citycount' AS DescTableName FROM dbo.[Subscriptions] 

INSERT INTO #TEST (Cnt, DescTableName) 
SELECT COUNT(*) AS Cnt, 'countrycount' AS DescTableName FROM dbo.ReportSchedule 

INSERT INTO #TEST (Cnt, DescTableName) 
SELECT COUNT(*) AS Cnt, 'address' AS DescTableName FROM msdb.dbo.sysjobs 

SELECT * FROM #TEST 

DROP TABLE #TEST 
+0

这会在'#TEST'表中给出三行,不是吗?没有一行有三个值。你的第二和第三个操作应该是UPDATE操作,而不是INSERT操作。 –

相关问题