2013-03-14 82 views
2

我知道我可以通過利用COUNT(*)函數的獲得具有在特定列的特定值的行數SQL得到列數在一個特定的行,但我想找到特定行中具有特定值的COLUMNS的數量。有關如何做到這一點的任何建議?具有特定價值

我會發布什麼,我已經試過到目前爲止的例子,但我在這一個完全喪失......

編輯1 - 這是一些示例數據和預期的結果:

桌子 - trabbill | u1 | u1paid | u2 | u2paid | u3 | u3paid | u4 | u4paid | u5 | u5paid

所以我想要做的就是當我選擇使用trackbill特定的行,我想通過它的所有列,看看哪些有值「假」。因此,如果u1和u3是唯一具有值false的列,則返回的答案應該是2.

+1

你能張貼一些樣本數據和期望的結果嗎?看看你試過的東西也很有幫助。 – Taryn 2013-03-14 18:58:52

+0

我試圖執行COUNT(*),但我無法得到它來計算列數,當我在網上搜索的幫助,我發現,COUNT(*)可以用來僅計算行數,不列數。 – 2013-03-14 19:03:13

回答

3

我會考慮你的表結構如下:

TABLE trackbill 
(u1  NUMBER(10,2) 
, u1paid VARCHAR(10) -- contains values 'Yes' or 'No' 
, u2  NUMBER(10,2) 
, u2paid VARCHAR(10) -- contains values 'Yes' or 'No' 
, u3  NUMBER(10,2) 
, u3paid VARCHAR(10) -- contains values 'Yes' or 'No' 
, u4  NUMBER(10,2) 
, u4paid VARCHAR(30) -- contains values 'Yes' or 'No' 
, u5  NUMBER(10,2) 
, u5paid VARCHAR(30) -- contains values 'Yes' or 'No' 
) 

因此,要檢查是的多少」是對於uxpaid列,我們可以編寫SQL爲:

SELECT u1, u1paid, u2, u2paid, u3, u3pai, u4, u4paid, u5, u5paid 
     , CASE u1paid WHEN 'Yes' THEN 1 ELSE 0 END 
     + CASE u2paid WHEN 'Yes' THEN 1 ELSE 0 END 
     + CASE u3paid WHEN 'Yes' THEN 1 ELSE 0 END 
     + CASE u4paid WHEN 'Yes' THEN 1 ELSE 0 END 
     + CASE u5paid WHEN 'Yes' THEN 1 ELSE 0 END 
     AS no_of_paid_columns 
    FROM trackbill 

我無法幫助您使用SQLite,因爲我不知道它。

+0

你的答案是一樣的,但更好。 – thursdaysgeek 2013-03-14 19:14:35

+0

哦,謝謝,我不知道。我正在打字,當我點擊「Post Answer」時,我看到了所有這些答案,並對哪一個是我的問題感到困惑! – Rachcha 2013-03-14 19:16:07

+0

工作就像一個絕對的魅力,謝謝! – 2013-03-14 19:26:54

1

如果您的列是布爾值,請嘗試簡單地添加列所以您的計數是u1paid + u2paid + u3paid + u4paid。根據語法,您可能需要稍微調整一下,但只要虛假條目爲0,它就可以成爲您計算的一種方式。

如果列不BOOL,你仍然可以做的是返回一個布爾值,取決於它是否有您正在尋找的價值每場一個比較,然後添加那些是真實的。

+0

您確實發佈了第一個帖子,但上面的答案更詳細,所以我接受了該答案。儘管如此,謝謝你的回覆! – 2013-03-14 19:27:57

+0

應該接受更好的答案,而不僅僅是誰是第一個。這就是爲什麼我看到其他答案發布後我給了它一個upvote。 – thursdaysgeek 2013-03-14 21:21:05

0

要做到這一點,最簡單的方法是unpivot的數據。您可以使用CROSS JOIN來創建一個虛擬表:

select trackbill, 
    count(*) Total 
from 
(
    select t.trackbill, 
    case c.col 
     when 'u1paid' then u1paid 
     when 'u2paid' then u2paid 
     when 'u3paid' then u3paid 
     when 'u4paid' then u4paid 
     when 'u5paid' then u5paid 
    end as data 
    from yourtable t 
    cross join 
    (
    select 'u1paid' as col 
    union all select 'u2paid' 
    union all select 'u3paid' 
    union all select 'u4paid' 
    union all select 'u5paid' 
) c 
) src 
where data = 'false' 
group by trackbill 

SQL Fiddle with Demo

0

你說你已經知道如何做到這一點,如果它是在一個垂直格式...

因此,這裏是你的水平表進行垂直:

SELECT Trackbill, u1paid FROM table 
UNION 
SELECT Trackbill, u2paid FROM table 
UNION 
SELECT Trackbill, u3paid FROM table 
UNION 
SELECT Trackbill, u4paid FROM table 
UNION 
SELECT Trackbill, u5paid FROM table 

您可以使用它作爲派生表寫入另一個選擇。