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