簡體   English   中英

從一個ASP SQL語句返回多個COUNT個結果

[英]Returning several COUNT results from one ASP SQL statement

說我有一張這樣的桌子:

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

我想確定每個領域已完成的比例。

我可以執行:

SELECT COUNT (Field1) WHERE (Field1 <> '') AS Field1Count      
SELECT COUNT (Field2) WHERE (Field2 <> '') AS Field2Count
SELECT COUNT (Field3) WHERE (Field3 <> '') AS Field3Count      
SELECT COUNT (Field4) WHERE (Field4 <> '') AS Field4Count  

是否可以將這些單獨的SQL語句匯總為一個,一擊即可返回4個結果? 這樣做有什么性能上的優勢(考慮到實際中列和行的數量可能會很大)?

您可以這樣:

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

如果將未填充的字段設置為NULL而不是空白,則可以依靠count()不包含NULL字段的事實。 所有具有按行功能的解決方案( ifcasecoalesce等)都適用於小型數據庫,但不適用於大型數據庫。 請記住,小是一個相對的術語,即使您認為數據庫很大,它也仍然可以使用-我在一家商店工作,那里的配置表大小為數百萬行:-)

然后,您可以使用:

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 = '';

但是,與所有數據庫性能問題一樣,請不要猜測。 並在目標環境中進行測量(或適當的復制)。 並經常測量。 數據庫調整不是“一勞永逸”的操作。

這是我將如何使用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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM