2

列[文字、数値]を含む次のようなものを返すsqliteクエリがあります

("a", 1) 
("a", 2)
("b", 3)
("c", 3)

文字が異なる場合は、数値列を0として取得したいと思います。それはどのように行われますか?

期待される出力:

("a", 1) 
("a", 2)
("b", 0)
("c", 0)
4

4 に答える 4

1

サブクエリを使用できます。

select t1.col1,
  case when t2.cnt > 1 then t1.col2 else 0 end col2
from table1 t1
left join
(
  select count(*) as cnt, col1
  from table1 
  group by col1
) t2
  on t1.col1 = t2.col1

デモで SQL Fiddle を参照してください

于 2012-10-01T16:29:50.260 に答える
1

( SQL Fiddle ):

SELECT Q.letter, 
    CASE WHEN (SELECT COUNT(*) FROM (query) QQ WHERE QQ.letter = Q.letter) = 1 THEN 0 
         ELSE Q.number
    END AS number
FROM (query) Q

「クエリ」を最初の結果を生成するクエリに置き換えてください。

于 2012-10-01T16:26:09.020 に答える
1
SELECT tba.mychar
-- if tbu.mychar is null, then the letter is not unique
--   when it happens, the letter is not "unique" thus use the number column
--   else use zero for "unique" letters
, CASE WHEN tbu.mychar IS NULL THEN tba.mynum ELSE 0 END AS newnum
FROM mytab tba
LEFT JOIN (
    -- this subquery only returns the letters that don't repeat
    SELECT mychar
    FROM mytab
    GROUP BY mychar
    HAVING COUNT(*) = 1
) AS tbu ON tba.mychar=tbu.mychar
于 2012-10-01T16:38:32.347 に答える
1

これは、2 つの別々のステートメントの UNION ALL を使用して行うことができます (1 つは繰り返される文字用で、もう 1 つは 1 回だけ出現する文字用です)。

    SELECT letter, number
    FROM tableName
    WHERE letter IN (
        SELECT letter
        FROM tableName
        GROUP BY letter
        HAVING COUNT(1) > 1
    )
UNION ALL
    SELECT letter, 0
    FROM tableName
    WHERE letter IN (
        SELECT letter
        FROM tableName
        GROUP BY letter
        HAVING COUNT(1) = 1
    )
于 2012-10-01T16:38:36.893 に答える