3

以下のような 2 つの列を持つ単純なテーブルがあります。

Id | Name
 0 |   A
 1 |   A
 2 |   B
 3 |   B
 4 |   C
 5 |   D
 6 |   E
 7 |   E

各「名前」がテーブルに表示される回数をカウントする SQL クエリを作成したいと考えています。ただし、これらの値が同じであるかのようにカウントするには、これらの値のいくつかが必要です。たとえば、通常の group by クエリは次のようになります。

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

上記のクエリは、次の結果を生成します。

Name | Count
  A  |   2
  B  |   2
  C  |   1
  D  |   1
  E  |   2

しかし、「A」と「B」を「A」だけであるかのようにカウントし、「D」と「E」を「D」だけであるかのようにカウントするクエリが必要なので、結果は次のようになります。

Name | Count
  A  |   4            // (2 "A"s + 2 "B"s)
  C  |   1
  D  |   3            // (1 "D"  + 2 "E"s)

この種のクエリを作成するにはどうすればよいですか?

4

4 に答える 4

3

で翻訳できますcase。また、サブクエリまたは CTE を使用できるため、同じことを繰り返す必要はありません。

with cte as (
    select
        case Name
            when 'B' then 'A'
            when 'E' then 'D'
            else Name
        end as Name
    from table
)
select Name, count(*)
from cte
group by Name

またはオンライン変換テーブルを使用:

select
    isnull(R.B, t.Name), count(*)
from table as t
    left outer join (
        select 'A', 'B' union all
        select 'E', 'D'
    ) as R(A, B) on R.A = t.Name
group by isnull(R.B, t.Name)
于 2013-09-06T16:52:57.340 に答える
2

ABD、を同じ数にする必要がある場合はE、次のようなクエリを作成できます。

SELECT
    CASE Name WHEN 'B' THEN 'A' WHEN 'E' THEN 'D' ELSE Name END as Name
,   COUNT(*)
FROM table
GROUP BY CASE Name WHEN 'B' THEN 'A' WHEN 'E' THEN 'D' ELSE Name END

sqlfiddle のデモ

于 2013-09-06T16:52:41.073 に答える
0

抽象化のレイヤーとCASE( SQL Fiddle の例):

;WITH x AS
(
    SELECT CASE Name WHEN 'B' THEN 'A'
                     WHEN 'E' THEN 'D'
                     ELSE Name
           END AS Name
    FROM Table1
)
SELECT Name, COUNT(1)
FROM x
GROUP BY Name

変換テーブル ( SQL Fiddle ) を使用する場合:

CREATE TABLE Translate(FromName char(1), ToName char(1));

INSERT INTO Translate VALUES ('B', 'A'), ('E', 'D');

SELECT COALESCE(t.ToName, a.Name) Name, COUNT(1)
FROM Table1 a
LEFT OUTER JOIN Translate t ON a.Name = t.FromName
GROUP BY COALESCE(t.ToName, a.Name)

FWIW、実際のテーブルの代わりに VALUES 派生テーブルを使用してこれを行うこともできます ( SQL Fiddle ):

SELECT COALESCE(t.ToName, a.Name) Name, COUNT(1)
FROM Table1 a
LEFT OUTER JOIN 
(
    VALUES ('B', 'A'), 
           ('E', 'D')
) t(FromName, ToName) ON a.Name = t.FromName
GROUP BY COALESCE(t.ToName, a.Name)
于 2013-09-06T16:53:28.047 に答える
0

これは動作します

 select t.a,count(t.id) from  (
       select case name when 'A' then 'A' when 'B' then 'A' 
                        when 'C' then 'C' when 'D' then 'C'
                        when 'D' then 'D' when 'E' then 'D' end as A,id
        from test) as t
    group by A;
于 2013-09-06T17:04:17.917 に答える