1

我正在尝试形成一个查询,该查询允许我计算非NULL的行

SELECT count(*) 
FROM jSettings 
WHERE linkToJData = '56211010105' 
  AND tblName1 IS NOT NULL 
  AND tblName2 IS NOT NULL;

我有名为tblName1-的列tblName25

我想要完成的只是找出tblNameXX有多少withoutNULL.

1上面的查询每次只产生一个。

4

6 回答 6

4
SELECT
 sum(case when tblName1 is null then 0 else 1 end) +
 sum(case when tblName2 is null then 0 else 1 end) +
 sum(case when tblName3 is null then 0 else 1 end) +
 sum(case when tblName4 is null then 0 else 1 end) +
 sum(case when tblName5 is null then 0 else 1 end) +
 sum(case when tblName6 is null then 0 else 1 end) +
 sum(case when tblName7 is null then 0 else 1 end) +
 sum(case when tblName8 is null then 0 else 1 end)   
FROM jSettings 
WHERE linkToJotData = '56211010105'

无需合并多个结果集。这种技术只需要对数据进行一次传递。

于 2012-11-29T14:32:33.070 回答
0

这里的问题在于 AND 条件。如果您提供 AND 条件,您将仅获得填充了 TBLNAME1..25 的所有值的那些记录。但是您的要求是单独查找有多少记录不具有空值。

您可以对每列使用联合并分别获取计数,然后将它们相加以获得非空值的总数。

让我知道这是否是预期的。

于 2012-11-29T14:19:27.340 回答
0

那是因为您正在查找 tblName1 和 tblName2 都为空的记录。这是你的意图吗?如果不是,那么您可以尝试:

Select count(*) totalrows 
From jSettings 
where linkToJData = '56211010105' 
  and (tblName1 IS NOT NULL OR tblName2 IS NOT NULL)
于 2012-11-29T14:20:15.627 回答
0

你可以这样做

declare @Data xml = 
(
    select *
    from jSettings
    where linkToJData = '56211010105'
    for xml path('row')
)

select count(*)
from @Data.nodes('/row/*[local-name(.) != "linkToJData"]') as T(C);

如果你不想使用 xml,你可以使用这个查询:

select count(*)
from jSettings as j
    outer apply (values
        (j.tblName1),
        (j.tblName2),
        (j.tblName3),
        (j.tblName4),
        (j.tblName5)
    ) as C(name)
where j.linkToJData = '56211010105' and c.name is not null;

如果您有很多列并且不想手动指定它:

declare @stmt nvarchar(max)

select @stmt =
    isnull(@stmt + ', ', '') + '(j.' + c.name + ')'
from sys.syscolumns as c
where id = object_id('dbo.jSettings') and c.name <> 'linkToJData'

select @stmt = '
select count(*)
from jSettings as j
    outer apply (values ' + @stmt + ') as C(name)
where j.linkToJData = @linkToJData and c.name is not null'

exec sp_executesql
    @stmt = @stmt,
    @params = N'@linkToJData nvarchar(128)',
    @linkToJData = '56211010105'

sql fiddle demo

我建议第 1 个或第 3 个 - 这样您就不必更改新列的查询

于 2012-11-29T14:27:20.637 回答
0
Select 'tblName1',count(*) totalrows1 
From jSettings 
where linkToJData = '56211010105' 
  and tblName1 IS NOT NULL
union
Select 'tblName2',count(*) totalrows2
From jSettings 
where linkToJData = '56211010105' 
  and tblName2 IS NOT NULL

尝试此代码以获取个人计数。

于 2012-11-29T14:34:14.270 回答
0
SELECT
 sum(case when tblName1 is null then 0 else 1 end) +
 sum(case when tblName2 is null then 0 else 1 end) +
 sum(case when tblName3 is null then 0 else 1 end) +
 sum(case when tblName4 is null then 0 else 1 end) +
 sum(case when tblName5 is null then 0 else 1 end) +
 sum(case when tblName6 is null then 0 else 1 end) +
 sum(case when tblName7 is null then 0 else 1 end) +
 sum(case when tblName8 is null then 0 else 1 end)   
FROM jSettings 
WHERE linkToJotData = '56211010105' 

这确实报告了7,这是正确的,因为唯一具有NULL的表是 tblName8。

于 2012-11-29T14:49:59.307 回答