テーブルがあります
create table us
(
a number
);
今私は次のようなデータを持っています:
a
1
2
3
4
null
null
null
8
9
今、私はnullをカウントする単一のクエリを必要とし、 A列にNULLでない値を
unionここでここを使うの?モンテクリストの答えは断然最高のソリューションです。
テーブルがあります
create table us
(
a number
);
今私は次のようなデータを持っています:
a
1
2
3
4
null
null
null
8
9
今、私はnullをカウントする単一のクエリを必要とし、 A列にNULLでない値を
unionここでここを使うの?モンテクリストの答えは断然最高のソリューションです。
回答:
これはOracleおよびSQL Serverで機能します(別のRDBMSで機能させることができる場合があります)。
select sum(case when a is null then 1 else 0 end) count_nulls
, count(a) count_not_nulls
from us;
または:
select count(*) - count(a), count(a) from us;
count(*)してcount(a)もでうまく機能group by
COUNT(a)します。追加するのに便利なコメントですが、これはスタックに応じて警告/エラーをスローし、コード内のコメントを保証する可能性があります。私はそのSUM方法を好みます。
count(*)にcount(1)
私が正しく理解していれば、列内のすべてのNULLとすべてのNOT NULLを数えたいと思います...
それが正しい場合:
SELECT count(*) FROM us WHERE a IS NULL
UNION ALL
SELECT count(*) FROM us WHERE a IS NOT NULL
コメントを読んだ後、完全なクエリを持つように編集されました:]
SELECT COUNT(*), 'null_tally' AS narrative
FROM us
WHERE a IS NULL
UNION
SELECT COUNT(*), 'not_null_tally' AS narrative
FROM us
WHERE a IS NOT NULL;
null:)
以下は、Oracleで動作するダーティバージョンです。
select sum(case a when null then 1 else 0) "Null values",
sum(case a when null then 0 else 1) "Non-null values"
from us
"Null values"になることだろう'Null values'。二重引用符ではなく単一引用符。
null以外
select count(a)
from us
ヌル用
select count(*)
from us
minus
select count(a)
from us
したがって
SELECT COUNT(A) NOT_NULLS
FROM US
UNION
SELECT COUNT(*) - COUNT(A) NULLS
FROM US
仕事をすべき
列のタイトルが正しく表示されるという点で優れています。
SELECT COUNT(A) NOT_NULL, COUNT(*) - COUNT(A) NULLS
FROM US
私のシステムでのいくつかのテストでは、テーブル全体をスキャンする必要があります。
select count(*) from t where a is null)がある場合はそうです。
さらに別の代替手段を提供するために、Postgres 9.4+ ではa FILTERを集計に適用できます。
SELECT
COUNT(*) FILTER (WHERE a IS NULL) count_nulls,
COUNT(*) FILTER (WHERE a IS NOT NULL) count_not_nulls
FROM us;
SQLFiddle:http ://sqlfiddle.com/#!17/80a24/5
これは少しトリッキーです。テーブルの列が1つだけだとすると、Count(1)とCount(*)は異なる値になります。
set nocount on
declare @table1 table (empid int)
insert @table1 values (1),(2),(3),(4),(5),(6),(7),(8),(9),(10),(NULL),(11),(12),(NULL),(13),(14);
select * from @table1
select COUNT(1) as "COUNT(1)" from @table1
select COUNT(empid) "Count(empid)" from @table1
画像からわかるように、最初の結果は、テーブルに16行あることを示しています。このうち2つの行はNULLです。したがって、Count(*)を使用すると、クエリエンジンは行数をカウントするため、カウント結果は16になります。しかし、Count(empid)の場合は、列empidの非NULL値をカウントしました。結果は14でした。
したがって、COUNT(Column)を使用するときは常に、以下に示すようにNULL値に注意してください。
select COUNT(isnull(empid,1)) from @table1
NULL値と非NULL値の両方をカウントします。
注:テーブルが複数の列で構成されている場合でも、同じことが当てはまります。Count(1)は、NULLまたはNULL以外の値に関係なく、行の総数を示します。Count(Column)を使用して列の値がカウントされる場合のみ、NULL値を処理する必要があります。
同様の問題がありました。すべての個別の値をカウントし、null値も1としてカウントしました。この場合、null値が考慮されないため、単純なカウントは機能しません。
以下は、SQLで機能し、新しい値の選択を含まないスニペットです。基本的に、distinctを実行すると、row_number()関数を使用して新しい列(n)に行番号も返し、その列でカウントを実行します。
SELECT COUNT(n)
FROM (
SELECT *, row_number() OVER (ORDER BY [MyColumn] ASC) n
FROM (
SELECT DISTINCT [MyColumn]
FROM [MyTable]
) items
) distinctItems
これはT-SQLで機能します。何かの数を数えるだけで、ヌルを含めたい場合は、大文字小文字の代わりにCOALESCEを使用します。
IF OBJECT_ID('tempdb..#us') IS NOT NULL
DROP TABLE #us
CREATE TABLE #us
(
a INT NULL
);
INSERT INTO #us VALUES (1),(2),(3),(4),(NULL),(NULL),(NULL),(8),(9)
SELECT * FROM #us
SELECT CASE WHEN a IS NULL THEN 'NULL' ELSE 'NON-NULL' END AS 'NULL?',
COUNT(CASE WHEN a IS NULL THEN 'NULL' ELSE 'NON-NULL' END) AS 'Count'
FROM #us
GROUP BY CASE WHEN a IS NULL THEN 'NULL' ELSE 'NON-NULL' END
SELECT COALESCE(CAST(a AS NVARCHAR),'NULL') AS a,
COUNT(COALESCE(CAST(a AS NVARCHAR),'NULL')) AS 'Count'
FROM #us
GROUP BY COALESCE(CAST(a AS NVARCHAR),'NULL')
Albertoをベースにして、ロールアップを追加しました。
SELECT [Narrative] = CASE
WHEN [Narrative] IS NULL THEN 'count_total' ELSE [Narrative] END
,[Count]=SUM([Count]) FROM (SELECT COUNT(*) [Count], 'count_nulls' AS [Narrative]
FROM [CrmDW].[CRM].[User]
WHERE [EmployeeID] IS NULL
UNION
SELECT COUNT(*), 'count_not_nulls ' AS narrative
FROM [CrmDW].[CRM].[User]
WHERE [EmployeeID] IS NOT NULL) S
GROUP BY [Narrative] WITH CUBE;
SELECT
ALL_VALUES
,COUNT(ALL_VALUES)
FROM(
SELECT
NVL2(A,'NOT NULL','NULL') AS ALL_VALUES
,NVL(A,0)
FROM US
)
GROUP BY ALL_VALUES
select count(isnull(NullableColumn,-1))
答えはすべて間違っているか、非常に古くなっています。
このクエリを実行する簡単で正しい方法は、COUNT_IF関数を使用することです。
SELECT
COUNT_IF(a IS NULL) AS nulls,
COUNT_IF(a IS NOT NULL) AS not_nulls
FROM
us
null以外の値をカウントするため
select count(*) from us where a is not null;
null値をカウントするため
select count(*) from us where a is null;
私はpostgres 10でテーブルを作成し、以下の両方が機能しました:
select count(*) from us
そして
select count(a is null) from us
a IS NULLTRUEまたはを生成しFALSE、COUNT()はすべてのNOT NULL値をカウントします。したがってcount(a is null)、すべての行の数を返します。
私の場合、私は複数の列の間の「ヌル分布」を望みました:
SELECT
(CASE WHEN a IS NULL THEN 'NULL' ELSE 'NOT-NULL' END) AS a_null,
(CASE WHEN b IS NULL THEN 'NULL' ELSE 'NOT-NULL' END) AS b_null,
(CASE WHEN c IS NULL THEN 'NULL' ELSE 'NOT-NULL' END) AS c_null,
...
count(*)
FROM us
GROUP BY 1, 2, 3,...
ORDER BY 1, 2, 3,...
「...」のとおり、必要に応じて、より多くの列に簡単に拡張できます。
aがnullである要素の数:
select count(a) from us where a is null;
aがnullでない要素の数:
select count(a) from us where a is not null;