sql >> Databáze >  >> RDS >> Mysql

Spočítat počet hodnot NULL v řadě

Nejsem si jistý, jestli existují lepší metody, ale tohle by mělo fungovat:

SELECT Field1, Field2, ISNULL(Field1) + ISNULL(Field2) Num_Null
FROM   YourTable;

Testovací případ:

CREATE TABLE YourTable (Field1 varchar(10), Field2 varchar(10));

INSERT INTO YourTable VALUES (NULL, 'A');
INSERT INTO YourTable VALUES ('B', 'C');
INSERT INTO YourTable VALUES ('B', NULL);
INSERT INTO YourTable VALUES (NULL, NULL);

Výsledek:

+--------+--------+----------+
| Field1 | Field2 | Num_Null |
+--------+--------+----------+
| NULL   | A      |        1 |
| B      | C      |        0 |
| B      | NULL   |        1 |
| NULL   | NULL   |        2 |
+--------+--------+----------+
4 rows in set (0.00 sec)

AKTUALIZACE: Dále k aktualizované otázce:

Pokud máte v tabulce sloupce, které vypadají jako affiliate_1 , affiliate_2 , atd., to je zřídkakdy dobrý nápad, protože byste míchali data s metadaty. Obecně je doporučenou opravou použití jiné závislé tabulky pro vztahy mezi uživateli a přidruženými společnostmi, jako v následujícím příkladu:

CREATE TABLE users (
   user_id int, 
   user_name varchar(100),
   PRIMARY KEY (user_id)
) ENGINE=INNODB;

CREATE TABLE users_affiliates (
   user_id int, 
   affiliate_name varchar(100),
   PRIMARY KEY (user_id, affiliate_name),
   FOREIGN KEY (user_id) REFERENCES users (user_id)
) ENGINE=INNODB;

Poté seřadíte users tabulka podle počtu přidružených společností bude vypadat asi takto:

SELECT    u.*, d_tb.num_aff
FROM      users
JOIN      (
             SELECT   user_id, COUNT(*) num_aff
             FROM     users_affiliates
             GROUP BY user_id
          ) d_tb ON (d_tb.user_id = u.user_id)
ORDER BY  d_tb.num_aff DESC;

Výhod je spousta, ale co je nejdůležitější, dotazy, jako jsou výše uvedené, se snadno píší a jsou dostatečně flexibilní, aby mohly pracovat s libovolným počtem přidružených společností (bez omezení počtem sloupců, které jste přidělili).



  1. Funkce LOCALTIMESTAMP() v Oracle

  2. Nelze se přihlásit k serveru SQL Server 2008 pomocí nástroje příkazového řádku

  3. Seskupování záznamů hodinu po hodině nebo den po dni a vyplňování mezer nulou nebo nulou v mysql

  4. Jak odstranit všechny řádky z tabulky kromě nejnovějších 10 řádků