1

私は次のデータを持っています:


   ID Column1 Column2 Column3 Column4 Column5
   001   A        C       D        A      B
   002   A        D       A        B      A
   003   B        K       Q        C      Q
   004   A        K       E        E      B

ビューに新しい列を作成して、各行の5つのソース列全体の「A」の数を取得したいと思います。結果は次のようになります。

    ID Column1 Column2 Column3 Column4 Column5  SumOfA
    001   A        C       D        A      B       2
    002   A        D       A        B      A       3
    003   B        K       Q        C      Q       0
    004   A        K       E        E      B       1

ここでいくつかの例を見てきましたが、レコード全体で「A」のインスタンスが返されます。行全体で集計するのではなく、列全体で「A」の数が必要です。何かご意見は?

4

4 に答える 4

5

複数の式を使用して値CASEをカウントできます。A

select id,
  column1, 
  column2,
  column3,
  column4, 
  column5,
  case when column1 = 'A' then 1 else 0 end +
  case when column2 = 'A' then 1 else 0 end +
  case when column3 = 'A' then 1 else 0 end +
  case when column4 = 'A' then 1 else 0 end +
  case when column5 = 'A' then 1 else 0 end TotalA
from yourtable

SQL FiddlewithDemoを参照してください

于 2013-03-20T19:08:46.853 に答える
4

このような状況では、CROSSAPPLYを使用して中間論理UNPIVOTを実行することをお勧めします。

SELECT
   *
FROM
   dbo.YourTable T
   CROSS APPLY (
      SELECT Count(*)
      FROM (VALUES (Column1), (Column2), (Column3), (Column4), (Column5)) C (Val)
      WHERE Val = 'A'
   ) A (Cnt)

これには、カウントする値を5か所ではなく1か所で変更できるという利点もあり、必要に応じて列を追加するのは非常に簡単です。

これがSQLフィドルで機能していることを確認してください

ただし、このクエリの作成に苦労しているということは、テーブルの設計がおそらく最適ではないことを示しています。列名自体にデータ(期間、地域、または他の種類の同様の値など)が含まれている場合、設計が最適ではないことはほぼ確実です。代わりに、ピボットされていないデータを保存することを強くお勧めします。値ごとに1つの行と列を使用し、新しい列は元の列を示します。

何らかの理由でスキーマを変更できない場合は、ビューの作成を検討してください。

CREATE VIEW dbo.YourTableUnpivoted
SELECT
   T.ID,
   C.*
FROM
   dbo.YourTable T
   CROSS APPLY (VALUES
      ('Column1', Column1),
      ('Column2', Column2),
      ('Column3', Column3),
      ('Column4', Column4),
      ('Column5', Column5)
   ) C (Col, Val);

PIVOT演算子も使用できます。)次に、これを再設計されたテーブルであるかのように使用できます。

SELECT
   ID,
   Count(*)
FROM
   dbo.YourTableUnpivoted
WHERE
   Val = 'A'
GROUP BY
   ID;
于 2013-03-21T08:19:44.250 に答える
1
SELECT 
(CASE WHEN Column1 = 'A' THEN 1 ELSE 0 END 
+ CASE WHEN Column2 = 'A' THEN 1 ELSE 0 END 
+ CASE WHEN Column3 = 'A' THEN 1 ELSE 0 END 
+ CASE WHEN Column4 = 'A' THEN 1 ELSE 0 END 
+ CASE WHEN Column5 = 'A' THEN 1 ELSE 0 END) AS SumOfA
FROM myTable
于 2013-03-20T19:07:26.070 に答える
0

CASEステートメントを使用してこれを実現できます。

SELECT 
    column1, column2, column3, column4, column5,
    (CASE WHEN Column1 = 'A' THEN 1 ELSE 0 END   
     + CASE WHEN Column2 = 'A' THEN 1 ELSE 0 END   
     + CASE WHEN Column3 = 'A' THEN 1 ELSE 0 END   
     + CASE WHEN Column4 = 'A' THEN 1 ELSE 0 END   
     + CASE WHEN Column5 = 'A' THEN 1 ELSE 0 END) AS TotalSum  
FROM yourTable
于 2013-03-20T19:12:21.383 に答える