2009-08-13 60 views
76

Tôi có một bảngĐếm các giá trị null và không null trong một truy vấn đơn

create table us 
(
a number 
); 

Bây giờ tôi có dữ liệu như:

a 
1 
2 
3 
4 
null 
null 
null 
8 
9 

Bây giờ tôi cần một truy vấn duy nhất để đếm vô không phải giá trị null trong cột a

+2

Hi, nơi nào bạn cần loại mã cơ sở dữ liệu đếm này trong cơ sở dữ liệu ngôn ngữ nào alking Trân trọng, Iordan – IordanTanev

+1

Tôi ngạc nhiên không có câu trả lời duy nhất chứa một liên minh đơn giản của số lượng lựa chọn (*) ... –

+0

@Lieven: Tại sao trên trái đất bạn sẽ sử dụng một 'công đoàn' ở đây? Câu trả lời của Montecristo là giải pháp tốt nhất. – Eric

Trả lời

-3

Số phần tử trong đó có giá trị rỗng:

select count(a) from us where a is null; 

Số yếu tố mà một không là null:

select count(a) from us where a is not null; 
+0

Câu hỏi đặt ra cho một truy vấn. – DreamWave

4

cho phi null

select count(a) 
from us 

cho null

select count(*) 
from us 

minus 

select count(a) 
from us 

Do đó

SELECT COUNT(A) NOT_NULLS 
FROM US 

UNION 

SELECT COUNT(*) - COUNT(A) NULLS 
FROM US 

nên làm công việc

+3

Tốt nước thịt, người đàn ông, nhìn vào kế hoạch thực hiện cho các truy vấn này. Bạn đang bắt đầu quét bảng trái và phải, đặc biệt là khi có một tuyên bố đơn giản đẫm máu ('select count (*) từ t where a null') thực hiện điều này. – Eric

+1

Tôi không có cơ sở dữ liệu để xem, nhưng cột đó có được lập chỉ mục hay không. Nếu có, nó xảy ra thông qua một phạm vi quét, nếu không, bạn đang khá nhiều trái với một bảng đầy đủ quét. Trong oracle, NULL không được lưu trữ trong chỉ mục, vì vậy tôi nghi ngờ ví dụ của bạn không tốt hơn nhiều. Milage của bạn có thể rất. – EvilTeach

+0

@EvilTeach: Chỉ mục chỉ hữu ích khi bạn không kéo lại> ~ 10% số hàng. Sau đó, quét toàn bộ được bắt đầu. Trong trường hợp này, bạn sẽ nhận được quét ít nhất một lần, nếu không phải là hai lần. – Eric

0

nếu mysql của nó, bạn có thể thử một cái gì đó như thế này.

select 
    (select count(*) from TABLENAME WHERE a = 'null') as total_null, 
    (select count(*) from TABLENAME WHERE a != 'null') as total_not_null 
FROM TABLENAME 
+0

Bạn đã thử điều đó chưa? –

31

Đây là một phiên bản nhanh chóng và dơ bẩn mà làm việc trên 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 
+1

Cú pháp tương tự cũng sẽ hoạt động trong SQL Server. Ngoài ra, làm theo cách này sẽ chỉ quét bảng một lần; các giải pháp UNION sẽ thực hiện hai lần quét bảng. Không thích hợp cho các bảng nhỏ, rất quan trọng đối với những bảng lớn. –

+1

Chỉ thay đổi cho SQL Server là '" Null values ​​"' sẽ phải trở thành ''Null values''. Dấu nháy đơn, không tăng gấp đôi. – Eric

+0

SQLServer sử dụng quét * chỉ mục * cho truy vấn này so với hai chỉ mục * tìm kiếm * bằng cách sử dụng một liên minh. Trên một bảng với 40.000 hàng, không có sự khác biệt về tốc độ. –

42

Nếu tôi hiểu đúng bạn muốn đếm tất cả NULL và tất cả NOT NULL trong một cột ...

Nếu đúng:

SELECT count(*) FROM us WHERE a IS NULL 
UNION ALL 
SELECT count(*) FROM us WHERE a IS NOT NULL 

Đã chỉnh sửa để có truy vấn đầy đủ, sau khi đọc nhận xét:]


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; 
+6

+1: Cách đơn giản nhất, nhanh nhất. Tôi đã bị sốc khi mọi câu trả lời không phải như vậy. – Eric

+5

Có nhưng không. Tôi nghĩ anh ấy muốn có số NULL và không NULL trong chỉ một truy vấn ... Bạn đang nói cách thực hiện điều đó trong hai truy vấn ... – romaintaz

+0

@romaintaz: Khá đúng. Tôi đọc tiêu đề là câu hỏi. Trong năm chỉnh sửa, không ai nghĩ đến việc sửa nó. Yeesh. – Eric

156

này làm việc cho Oracle và SQL Server (bạn có thể để có được nó để làm việc trên một RDBMS):

select sum(case when a is null then 1 else 0 end) count_nulls 
    , count(a) count_not_nulls 
    from us; 

Hoặc:

select count(*) - count(a), count(a) from us; 
+9

Tin hay không, đó là ANSI SQL ... – Eric

+0

Rất tuyệt. Tôi cũng đang nghi ngờ một đường chuyền. – EvilTeach

+0

Sử dụng sự phân biệt giữa 'count (*)' và 'count (a)' cũng hoạt động tốt với 'group by' – shannon

1

Nếu bạn đang sử dụng MS Sql Server ...

SELECT COUNT(0) AS 'Null_ColumnA_Records', 
(
    SELECT COUNT(0) 
    FROM your_table 
    WHERE ColumnA IS NOT NULL 
) AS 'NOT_Null_ColumnA_Records' 
FROM your_table 
WHERE ColumnA IS NULL; 

Tôi không khuyên bạn làm điều này ... nhưng ở đây bạn có nó (trong cùng một bảng kết quả)

0
SELECT SUM(NULLs) AS 'NULLS', SUM(NOTNULLs) AS 'NOTNULLs' FROM 
    (select count(*) AS 'NULLs', 0 as 'NOTNULLs' FROM us WHERE a is null 
    UNION select 0 as 'NULLs', count(*) AS 'NOTNULLs' FROM us WHERE a is not null) AS x 

Đó là fugly, nhưng nó sẽ trả về một hồ sơ duy nhất với 2 cols chỉ ra đếm null và không null.

1

sử dụng hàm ISNULL được nhúng.


+0

Đây cũng là một câu trả lời xứng đáng. Cá nhân tôi thấy rằng COUNT (DISTINCT ISNULL (A, '')) hoạt động tốt hơn sau đó COUNT (DISTINCT A) + SUM (TRƯỜNG HỢP KHI MỘT SỐ NULL THEN 1 ELSE 0 END) – Vladislav

-1

Chỉ trong trường hợp bạn muốn có nó trong một hồ sơ duy nhất:

select 
    (select count(*) from tbl where colName is null) Nulls, 
    (select count(*) from tbl where colName is not null) NonNulls 

;-)

1

Dưới đây là hai giải pháp:

Select count(columnname) as countofNotNulls, count(isnull(columnname,1))-count(columnname) AS Countofnulls from table name 

HOẶC

Select count(columnname) as countofNotNulls, count(*)-count(columnname) AS Countofnulls from table name 
0

select count (isnull (NullableColumn, -1))

2

Tôi có một vấn đề tương tự: để đếm tất cả các giá trị riêng biệt, cũng tính giá trị null là 1. Một số đếm đơn giản không hoạt động trong trường hợp này, vì nó không tính đến các giá trị null.

Đây là đoạn mã hoạt động trên SQL và không liên quan đến việc chọn các giá trị mới. Về cơ bản, một lần biểu diễn, cũng trả lại số khác biệt hàng trong một cột mới (n) bằng cách sử dụng row_number() chức năng, sau đó thực hiện một số trên cột rằng:

SELECT COUNT(n) 
FROM (
    SELECT *, row_number() OVER (ORDER BY [MyColumn] ASC) n 
    FROM (
     SELECT DISTINCT [MyColumn] 
        FROM [MyTable] 
     ) items 
) distinctItems 
1

Hãy thử

SELECT 
    SUM(ISNULL(a)) AS all_null, 
    SUM(!ISNULL(a)) AS all_not_null 
FROM us; 

Đơn giản!

-1

cho đếm không giá trị null

select count(*) from us where a is not null; 

cho đếm các giá trị null

select count(*) from us where a is null; 
+0

Câu hỏi được yêu cầu cho truy vấn đơn :) – infografnet

0

này hoạt động trong T-SQL. Nếu bạn chỉ đếm số lượng của một cái gì đó và bạn muốn bao gồm các null, sử dụng COALESCE thay vì trường hợp.

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

Xây dựng khỏi Alberto, tôi đã thêm danh sách.

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; 
12

Như tôi hiểu câu hỏi của bạn, Bạn chỉ cần chạy script này và nhận Tổng Null, Tổng hàng notnull,

select count(*) - count(a) as 'Null', count(a) as 'Not Null' from us; 
3

Đây là chút khéo léo. Giả sử bảng chỉ có một cột, thì Đếm (1) và Đếm (*) sẽ cho các giá trị khác nhau.

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 

Query Results

Như bạn có thể nhìn thấy trong hình, Kết quả đầu tiên cho thấy bảng có 16 hàng. trong đó có hai hàng là NULL. Vì vậy, khi chúng tôi sử dụng Đếm (*) công cụ truy vấn tính số hàng, Vì vậy, chúng tôi đã đếm kết quả là 16. Nhưng trong trường hợp của Đếm (empid) nó được tính không NULL giá trị trong cột empid. Vì vậy, chúng tôi nhận được kết quả là 14.

vì vậy bất cứ khi nào chúng tôi đang sử dụng COUNT (Cột) đảm bảo chúng tôi xử lý các giá trị NULL như được hiển thị bên dưới.

select COUNT(isnull(empid,1)) from @table1 

sẽ tính cả giá trị NULL và Non-NULL.

Lưu ý: Điều tương tự cũng được áp dụng ngay cả khi bảng được tạo thành từ nhiều cột. Đếm (1) sẽ cho tổng số hàng không phân biệt giá trị NULL/Non-NULL. Chỉ khi các giá trị cột được tính bằng Đếm (Cột), chúng ta cần phải quan tâm đến các giá trị NULL.

7

thường tôi sử dụng thủ thuật này

select sum(case when a is null then 0 else 1 end) as count_notnull, 
     sum(case when a is null then 1 else 0 end) as count_null 
from tab 
group by a 
0
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 
Các vấn đề liên quan