2

COUNT(*)関数を使用することで、特定の列の特定の値を持つ行の数を取得できることはわかっていますが、特定の値を持つ特定の行のCOLUMNSの数を見つけたいと思います。これを行う方法について何か提案はありますか?

今まで試したことの例を投稿していたのですが、これで完全に迷ってしまいました...

編集1-ここにいくつかのサンプルデータと期待される結果があります:

表-トラックビル| u1 | u1paid | u2 | u2paid | u3 | u3paid | u4 | u4paid | u5 | u5paid

したがって、trackbillを使用して特定の行を選択するときに、そのすべての列を調べて、値が「false」である列を確認したいと思います。したがって、u1paidとu3paidだけが値falseを持つ列である場合、返される答えは2になります。

4

4 に答える 4

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であなたを助けることはできません。

于 2013-03-14T19:12:42.200 に答える
1

列がブール値の場合は、単に列を追加してみてください。つまり、カウントはu1paid + u2paid + u3paid+u4paidになります。構文によっては、少し調整する必要があるかもしれませんが、falseエントリが0である限り、カウントを取得する方法になります。

列がboolでない場合でも、探している値があるかどうかに応じて、boolを返す各フィールドで比較を実行し、真のフィールドを追加できます。

于 2013-03-14T19:10:23.937 に答える
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

これを派生テーブルとして使用して、別のselectを書き込むことができます。

于 2013-03-14T19:19:40.783 に答える
0

これを行う最も簡単な方法は、データのピボットを解除することです。を使用し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 FiddlewithDemoを参照してください

于 2013-03-14T19:11:09.630 に答える