2

次の値を持つSQLテーブルがあります

       |  col1 | col2|   source |  values
       |  1    |  2  |  A       |   null
       |  1    |  2  |  B       |   1.0
       |  1    |  2  |  C       |   null
       |  1    |  4  |  A       |   2.0
       |  1    |  4  |  B       |   2.0
       |  1    |  4  |  C       |   2.0
       |  1    |  5  |  A       |   null
       |  1    |  5  |  B       |   null
       |  1    |  5  |  C       |   null

col1グループとcol2フラグを使用して出力を取得するにはどうすればよいですか。

  • グループのすべての値が一致する (フラグ = 1)
  • すべての値が null (フラグ = 2)
  • 一部の値が null (フラグ = 3)

出力:

       |  col1 | col2|   flag
       |  1    |  2  |   3
       |  1    |  4  |   1
       |  1    |  5  |   2
4

3 に答える 3

3

または:更新された質問に基づいて:

  SELECT 
    col1, 
    col2,
    SUM(CASE WHEN SomeConditionHere THEN 1 ELSE 0 END) AS Flag
  FROM Table1
  GROUP BY col1, col2;

SQL フィドルのデモ

これにより、次のことが得られます。

| COL1 | COL2 | FLAG |
----------------------
|    1 |    2 |    2 |
|    1 |    4 |    0 |
|    1 |    5 |    3 |

注意:フラグは列NULL内の値の数であると想定したため、代わりに.VALUES"Values" IS NULLSomeConditionHere

flagあなたが投稿した予想される結果で がどのように計算されるべきか理解できませんでした。の代わりにフラグを定義する述語を使用する必要があります"Values" IS NULL

アップデート:

これを試して:

WITH Flags
AS
(
  SELECT 
    col1, col2,
    COUNT(*) ValuesCount,
    SUM(CASE WHEN "Values" IS NULL THEN 1 ELSE 0 END) AS NULLValues
  FROM Table1 
  GROUP BY col1, col2
)
SELECT 
  col1,
  col2,
  Flag = CASE WHEN ValuesCount = NULLValues THEN 2
              WHEN NULLVALUES = 0 
               AND ValuesCount = (SELECT COUNT(*) 
                                  FROM Table1 t2
                                  WHERE t1.col1 = t2.col1
                                    AND t1.col2 = t2.col2) THEN 1
               ELSE 3
END
FROM Flags t1;

更新された SQL Fiddle デモ

これにより、次のことが得られます。

| COL1 | COL2 | FLAG |
----------------------
|    1 |    2 |    3 |
|    1 |    4 |    1 |
|    1 |    5 |    2 |
于 2013-01-14T08:44:49.337 に答える
3

SQLServer2005 以降では

;WITH cte AS
 (
  SELECT col1, col2, [values],       
         COUNT(CASE WHEN [values] IS NULL THEN 1 END) OVER(PARTITION BY col1, col2) AS cntNULL,
         COUNT(*) OVER(PARTITION BY col1, col2) AS cntCol
  FROM dbo.test5
  )
  SELECT col1, col2, MAX(CASE WHEN cntNULL = 0 THEN 1
                              WHEN cntNULL = cntCol THEN 2
                              ELSE 3 END) AS flag
  FROM cte
  GROUP BY col1, col2  

SQLFiddle のデモ

于 2013-01-14T09:23:08.990 に答える
2

...さらに移植性を高めたい場合は、CTEなしのソリューションSQL

select col1,
       col2,
        case 
            when DistinctValuesWithoutNulls = 1 and NullCount = 0 then 1 
            when DistinctValuesWithoutNulls = 0 then 2
            when NullCount > 0 then 3
        end flag
from
(
    select  col1, 
            col2, 
            count(distinct [values]) DistinctValuesWithoutNulls, 
            sum(case when [values] is null then 1 else 0 end) NullCount
    from Table1
    group by col1, col2
) tmp
于 2013-01-14T10:07:11.123 に答える