web-dev-qa-db-ja.com

SQL Serverでのcount(*)によるカウントの除算

これが私のクエリです:

SELECT 
    COUNT(*) AS total,
    COUNT(CASE WHEN t.id IS NULL THEN 1 END) AS nb_null,
    COUNT(CASE WHEN t.id IS NOT NULL THEN 1 END) AS nb_not_null
FROM
    table t

フィールドをエイリアスで分割することは可能ですか? :

SELECT 
    COUNT(*) AS total,
    COUNT(CASE WHEN t.id IS NULL THEN 1 END) / total AS nb_null,
    COUNT(CASE WHEN t.id IS NOT NULL THEN 1 END) AS nb_not_null
FROM
    table t

SQL Serverでは機能しません。これを行う方法があるかどうか知りたいのですが。ありがとう

6

の代わりに

COUNT(CASE WHEN t.id is null THEN 1 END)/Count(*) 

使用できます

AVG(CASE WHEN t.id is null THEN 1.0 ELSE 0 END)
16
Martin Smith

任意の数の機能(nullだけでなく非null)を使用して同様の問題を解決する必要があり、それらをパーセンテージに変換することも必要でした。これは、あなたや他の同様の質問を持つ人にとって役立つかもしれません:

WITH counts AS 
  (SELECT [feature], 
  COUNT(*) AS cnt
  FROM [your_table]
  GROUP BY [feature])
SELECT [feature], CAST(100 * num AS DOUBLE) / (SELECT SUM(num) FROM counts) 
  AS pct
FROM counts
ORDER BY pct DESC
4
mr_snuffles

残念ながら、SQL Serverではそのようなaliasを使用できません。式を繰り返す必要があります。 (既に見つけて他の人が投稿したように)subquery/cte/joinなどを使用してそのエイリアスを持つ列を返し、そのように使用できますが、それは列/式の名前であり、エイリアスではありません。

SELECT Count(*) as total,
count(CASE WHEN t.id is null THEN 1 END)/(Count(*)+.0)  as nb_null,
COUNT(CASE WHEN t.id is not null THEN 1 END) as nb_not_null
from table t

また、+.0整数除算を回避するために除算式のいずれかの側に追加します(パーセントの場合、0.ddddではなく0を返します)。

2
SqlZim

わかりました。

SELECT nb_null/total from(
   SELECT Count(*) as total,
   COUNT(CASE WHEN t.id is null THEN 1 END) as nb_null,
   COUNT(CASE WHEN t.id is not null THEN 1 END) as nb_not_null
   from table t
) as req
1

私はこれを次のように書きます:

_select Count(*) as total,
       avg(case when t.id is null then 1.0 else 0 end) as nb_null,
       count(t.id) as nb_not_null
from table t;
_

COUNT(<col>)の定義は、NULL以外の値をカウントすることです。組み込み関数を使用した方がいいかもしれません。

ただし、idという列がNULLになる理由は私にはわかりません。 _NOT NULL_と宣言する必要があります。

1
Gordon Linoff