我正在尝试形成一个查询,该查询允许我只计算非NULL的行
SELECT count(*)
FROM jSettings
WHERE linkToJData = '56211010105'
AND tblName1 IS NOT NULL
AND tblName2 IS NOT NULL;
我有名为tblName1
-的列tblName25
。
我想要完成的只是找出tblNameXX
有多少without
个NULL
.
1
上面的查询每次只产生一个。
我正在尝试形成一个查询,该查询允许我只计算非NULL的行
SELECT count(*)
FROM jSettings
WHERE linkToJData = '56211010105'
AND tblName1 IS NOT NULL
AND tblName2 IS NOT NULL;
我有名为tblName1
-的列tblName25
。
我想要完成的只是找出tblNameXX
有多少without
个NULL
.
1
上面的查询每次只产生一个。
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'
无需合并多个结果集。这种技术只需要对数据进行一次传递。
这里的问题在于 AND 条件。如果您提供 AND 条件,您将仅获得填充了 TBLNAME1..25 的所有值的那些记录。但是您的要求是单独查找有多少记录不具有空值。
您可以对每列使用联合并分别获取计数,然后将它们相加以获得非空值的总数。
让我知道这是否是预期的。
那是因为您正在查找 tblName1 和 tblName2 都为空的记录。这是你的意图吗?如果不是,那么您可以尝试:
Select count(*) totalrows
From jSettings
where linkToJData = '56211010105'
and (tblName1 IS NOT NULL OR tblName2 IS NOT NULL)
你可以这样做
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'
我建议第 1 个或第 3 个 - 这样您就不必更改新列的查询
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
尝试此代码以获取个人计数。
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。