Возврат нескольких результатов COUNT из одного оператора ASP SQL - PullRequest
1 голос
/ 18 мая 2010

Скажем, у меня есть такая таблица:

Field1  Field2  Field3  Field4
fred    tom     fred    harry 
tom             tom
dick    harry
harry           

и я хочу определить, какая часть была заполнена для каждого поля.

Я могу выполнить:

* +1007 *

Можно ли свернуть эти отдельные операторы SQL в один, который будет возвращать 4 результата за одно попадание? Есть ли какое-то преимущество в производительности (учитывая, что количество столбцов и строк на практике может быть довольно большим)?

Ответы [ 3 ]

5 голосов
/ 18 мая 2010

Вы можете сделать так:

select
  sum(case when Field1 <> '' then 1 else 0 end) as Field1Count,
  sum(case when Field2 <> '' then 1 else 0 end) as Field2Count,
  sum(case when Field3 <> '' then 1 else 0 end) as Field3Count,
  sum(case when Field4 <> '' then 1 else 0 end) as Field4Count
from TheTable
2 голосов
/ 18 мая 2010

Если вы установите пустые поля равными NULL вместо пробелов, вы можете полагаться на тот факт, что count() не будет включать пустые поля. Все решения с функцией каждой строки (if, case, coalesce и т. Д.) Подходят для небольших баз данных, но плохо масштабируются для больших баз данных. Имейте в виду, что small - это термин относительно , он может быть приемлем для ваших баз данных, даже если вы думаете, что они большие - я работаю в магазине, где миллионы строк имеют размеры наших таблиц конфигурации: -)

Тогда вы можете просто использовать:

select
    count(field1) as count1,
    count(field2) as count2,
    count(field3) as count3,
    count(field4) as count4
from ...

(или count(distinct fieldX) для разных значений, конечно).

Если это правдоподобный путь, вы можете просто настроить свой стол с помощью:

update tbl set field1 = NULL where field1 = '';
update tbl set field2 = NULL where field2 = '';
update tbl set field3 = NULL where field3 = '';
update tbl set field4 = NULL where field4 = '';

Но, как и во всех вопросах производительности базы данных, измеряют, не угадывают. И измеряют в целевой среде (или подходящей копии). И измерять часто. Настройка базы данных не является операцией установки и забывания.

1 голос
/ 18 мая 2010

Вот как я бы это сделал, используя MySQL

select sum(CASE WHEN Field1 <>'' THEN 1 ELSE 0 END) as Field1Count 
     , sum(CASE WHEN Field2 <>'' THEN 1 ELSE 0 END) as Field2Count 
     , sum(CASE WHEN Field3 <>'' THEN 1 ELSE 0 END) as Field3Count 
     ...
     , sum(CASE WHEN FieldN <>'' THEN 1 ELSE 0 END as FieldNCount 
  from DataTable
...