COUNT
의 동작을 사용하면 NULL
값을 무시할 수 있습니다.
행 수 계산에서 검사중인 열 수를 뺍니다. 0
값을 반환하는 열은 NULL
값을 포함하지 않습니다. 고려해야 할 값을 "공백"으로 변환하려면 CASE
문을 사용하여 NULL
으로 변환해야합니다.
이 방법을 사용하면 테이블을 "회전"시키기 위해 전체 테이블을 복사 할 필요가 없습니다.
나는 당신을 위해 작동 할 here in SQLFiddle 예를 채웠다.
CREATE TABLE address
(
address int auto_increment primary key,
street1 varchar(20),
street2 varchar(20),
city varchar(20),
state varchar(20),
zip int,
comment varchar(20)
);
INSERT INTO address
(street1, street2, city, state, zip, comment)
VALUES
('123 Main St.', null, 'Cleveland', 'OH', 44123, ''),
('1313 Mockingbird Ln.', null, 'Cleveland', 'OH', 0, 'Unknown zip'),
('321 Main St.', 'Apt #1', 'Cleveland', 'OH', 44123, ''),
('321 Main St.', 'Apt #2', 'Cleveland', 'OH', 44123, '');
SELECT
COUNT(*) rows, -- not really needed, you can remove this
COUNT(*) - COUNT(CASE ad.street1 WHEN '' THEN NULL ELSE ad.street1 END) empty_street1,
COUNT(*) - COUNT(CASE ad.street2 WHEN '' THEN NULL ELSE ad.street2 END) empty_street2,
COUNT(*) - COUNT(CASE ad.city WHEN '' THEN NULL ELSE ad.city END) empty_city,
COUNT(*) - COUNT(CASE ad.state WHEN '' THEN NULL ELSE ad.state END) empty_state,
-- Change the value being compared based on the column type. Strings '', numbers 0, etc.
COUNT(*) - COUNT(CASE ad.zip WHEN 0 THEN NULL ELSE ad.zip END) empty_zip,
COUNT(*) - COUNT(CASE ad.comment WHEN '' THEN NULL ELSE ad.comment END) empty_comment
FROM address ad;
결과 :
가 여기에 링크를 사용할 수 없게 될 경우 my SQLFiddle example의 내용이다
ROWS EMPTY_STREET1 EMPTY_STREET2 EMPTY_CITY EMPTY_STATE EMPTY_ZIP EMPTY_COMMENT
4 0 2 0 0 1 3
Bah - 어떻게 든 '0'과 빈 문자열 요구 사항을 놓쳤습니다. 나는 곧 개정 할 것이다. –
자, 가세요.이 질문은 당신이 요구 한대로해야한다고 생각합니다. –
항상 모든 레코드를 계산하기 때문에 [count (*)] (http://dev.mysql.com/doc/refman/5.0/en/group-by-functions.html#function_count)를 사용하십시오. –