2015-10-06 47 views
-1

我有一個表,像這樣的列:SQL要計算多列的值

1,名稱,name_thesame,adress1,adress2,adress_thesame,city1,位於City2,city_thesame

在結尾的所有列_thesame,有一個真實的或假的,如果name1和name2是相同的,與地址等相同等012等等。

無法包裝我的頭如何做這個查詢 - 任何機構有一些想法或指針?由於

+3

您正在使用哪個數據庫管理系統? – pedram

+2

編輯您的問題並提供樣本數據和預期結果。這個問題並不完全清楚。 –

+0

http://stackoverflow.com/questions/17194145/sql-count-based-on-column-value是幾乎相同的問題 – Terminus

回答

1

對於單一的屬性,你可以這樣做:

select name_thesame, count(*) 
from table 
group by name_thesame 

這會給你類似的結果:

true  10 
false 15 

如果你想擁有它用作多個列的列表,你可以工會查詢:

select 'Name', name_thesame, count(*) 
    from table 
    group by name_thesame 
union 
select 'Address', adress_thesame, count(*) 
    from table 
    group by adress_thesame 

越來越:

Name true 10 
Name false 15 
Address true 20 
Address false 5 
+0

謝謝,是的,這會給我正確的結果。不過,我希望有一個解決方案來編程,所以我不必硬編碼每個列的名稱,因爲有100多個我希望計數完成的地方。但我會接受答案並進行硬編碼,謝謝 – user2199192

+2

@ user2199192您應該在您的問題中指定... –

+1

說實話,100+(表中的300+字段)是一點紅旗,設計明智:) – SWeko

1

這是另一種選擇:

SELECT SUM(CASE WHEN name_thesame = true THEN 1 ELSE 0 END) as nametrue, 
     SUM(CASE WHEN name_thesame = false THEN 1 ELSE 0 END) as namefalse, 
     SUM(CASE WHEN adress_thesame = true THEN 1 ELSE 0 END) as adresstrue, 
     SUM(CASE WHEN adress_thesame = false THEN 1 ELSE 0 END) as adressfalse, 
     SUM(CASE WHEN city_thesame = true THEN 1 ELSE 0 END) as citytrue, 
     SUM(CASE WHEN city_thesame = false THEN 1 ELSE 0 END) as cityfalse 
FROM yourTable 

你可以調整它來處理NULL S以及如果相關:

... 
CASE WHEN name_thesame = false OR name_thesame IS NULL THEN 1 ELSE 0 END 
... 

或任NVL()ISNULL()IFNULL()COALESCE(),取決於您正在使用的DBMS(語法始終相同):

... 
CASE WHEN COALESCE(name_thesame, false) = false THEN 1 ELSE 0 END 
... 

結果:

nametrue | namefalse | adresstrue | adressfalse | citytrue | cityfalse 
     5 |   7 |   2 |   1 |  10 |   8 
+0

如果他沒有'NULL',他可以從總行數中減去真值#來得到錯誤的數量? – Terminus

+0

當然可以這樣做,但它不會使查詢更短或更高性能(類似於'COUNT(*) - SUM(CASE WHEN name_thesame = true THEN 1 ELSE 0 END)')。除非我錯過明顯的東西? –

+0

可以把它放在應用程序中,但我想它,不知道如果這是更好的方式。 – Terminus