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毎回しか生成しません。

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'

複数の結果セットを結合する必要はありません。この手法では、データを 1 回パスするだけで済みます。

于 2012-11-29T14:32:33.070 に答える
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

ここでの問題は AND 条件にあります。AND 条件を指定すると、TBLNAME1..25 のすべての値が取り込まれたレコードのみが取得されます。ただし、null 値ではないレコードの数を個別に見つける必要があります。

各列にユニオンを使用してカウントを個別に取得し、それらを合計して、null 以外の値の合計カウントを取得できます。

これが意図されたものかどうか教えてください。

于 2012-11-29T14:19:27.340 に答える
0

これは、tblName1 と tblName2 の両方が null であるレコードを探しているためです。それはあなたの意図ですか?そうでない場合は、次のことを試してください。

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
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' 

NULLを持つ唯一のテーブルは tblName8であるため、これは正しい7を報告します。

于 2012-11-29T14:49:59.307 に答える