2012-10-25 52 views
0

我有以下查詢:SQLite的 - 檢查是否有任何領域對每一列1

SELECT c.danhoEstetico, c.danhoDirecto 
FROM conceptos c 
INNER JOIN materialesconceptos mc ON mc.idConcepto = c.idConcepto 
INNER JOIN materiales m ON m.idMaterial = mc.idMaterial 
WHERE m.idMaterial IN (4,11,11) 

其產生以下結果(例如):

danhoEstetico | danhoDirecto 
1    | 0 
1    | 0 
0    | 0 
0    | 0 

我需要做一個查詢,如果每列中的任何項目都有1,如同一列中所有字段中的OR,則輸出爲:

danhoEstetico | danhoDirecto 
1    | 0 

我曾嘗試:

SELECT 
SUM(CASE c.danhoEstetico WHEN c.danhoEstetico=1 THEN 1 ELSE 0 END) AS de, 
SUM(CASE c.danhoDirecto WHEN c.danhoDirecto=1 THEN 1 ELSE 0 END) AS dd 
FROM conceptos c INNER JOIN materialesconceptos mc ON mc.idConcepto = c.idConcepto 
INNER JOIN materiales m ON m.idMaterial = mc.idMaterial 
WHERE m.idMaterial IN (4,11,11) 

其中,出於某種原因,收益率:

danhoEstetico | danhoDirecto 
4    | 4 

對此有何暗示?

回答

1

要獲得每列中最大的值,請使用MAX而不是SUM

+0

標記爲刪除,因爲獲取最大值與該問題無關。 – dan1111

+0

二進制0/1值上的'OR'與'MAX'相同。 –

+0

我的歉意,我誤解了這個問題。 – dan1111

0
select distinct 
     c.danhoEstetico, c.danhoDirecto 
FROM conceptos c 
INNER JOIN materialesconceptos mc ON mc.idConcepto = c.idConcepto 
INNER JOIN materiales m ON m.idMaterial = mc.idMaterial 
where 1 in (c.danhoEstetico , c.danhoDirecto) 
+0

太棒了。謝謝。 – manutenfruits

1

編輯:我誤解了這個問題。此解決方案檢查每列中的行是1,而不是的任何行。我推薦CL的回答,但我會在這裏留下這個答案,因爲它解釋了問題中CASE聲明的問題。

您應該使用CASE沒有鹼表達:

SELECT 
SUM(CASE WHEN c.danhoEstetico=1 THEN 1 ELSE 0 END) AS de, 
SUM(CASE WHEN c.danhoDirecto=1 THEN 1 ELSE 0 END) AS dd 
FROM conceptos c INNER JOIN materialesconceptos mc ON 
    mc.idConcepto = c.idConcepto 
INNER JOIN materiales m ON m.idMaterial = mc.idMaterial 
WHERE m.idMaterial IN (4,11,11) 

the documentation

在用鹼中表達的情況下,基部表達式求值 只是一次,其結果是與從每個 WHEN的表達從左到右的評估進行比較。 CASE表達式 的結果是,對應於第一 WHEN表達式其比較結果爲真...

在書面陳述你的case語句總是評估,以1 Then表達式的評價當列爲時列爲10。因此,它們總是匹配的,總和總是行數。

更新:現在你怎麼把這個變成你想要的結果呢?這裏有一種方法:

SELECT 
SUM(CASE WHEN c.danhoEstetico=1 THEN 1 ELSE 0 END)/SUM(1) AS de, 
SUM(CASE WHEN c.danhoDirecto=1 THEN 1 ELSE 0 END)/SUM(1) AS dd 
FROM conceptos c INNER JOIN materialesconceptos mc ON 
    mc.idConcepto = c.idConcepto 
INNER JOIN materiales m ON m.idMaterial = mc.idMaterial 
WHERE m.idMaterial IN (4,11,11) 

這利用了整數算術。如果不是列中的所有行都是1,則該部門的值將爲< 1,小於1的值將顯示爲零。

+0

這樣我得到2,2結果 – manutenfruits

+0

@manutenfruits,看到更新。我最初的回答只是解釋了爲什麼'case'聲明沒有按預期工作。 – dan1111

相關問題