1

ID と値のリストを取得する必要があるクエリと戦っています。

次に、複数の値を持つ ID に対して新しい値をキャストする必要があります。

例えば:

ID          COLOR
1           BLUE
1           GREEN
2           ORANGE

私が返したいのは次のようなものです:

ID          COLOR
1           MULTIPLE
2           ORANGE

ここまでは、ROW_NUMBER() と OVER(PARTITION BY) を使用してすべての結果を取得し、それらに番号を付けました。

しかし、その後、私は輪になって立ち往生します。

複数回出現する ID (行数が 2 以上) で制限することができ、「MULTIPLE」としてキャストする必要がある ID を取得します。

しかし、複数の値の ID にも行番号 1 があるため、1 つの値 (=1) のみを持つ ID に制限すると、同じ値も含まれます。値 ID を 2 回、次のように入力します。

ID         COLOR
1          BLUE
1          MULTIPLE
2          ORANGE

問題は、値が 1 つしかない ID とは別に、複数の値を持つすべての ID を取得するにはどうすればよいかということです。

4

2 に答える 2

4

これを試して:

SELECT id, 
CASE WHEN COUNT(color) > 1 THEN 'MULTIPLE'
     ELSE MAX(color)
END AS color
FROM Table1
GROUP BY id

SQLFIDDLE http://sqlfiddle.com/#!6/daf77/4でテストしたところ、問題なく動作するようです

于 2013-10-16T23:27:06.977 に答える
1

ウィンドウ集計関数を使用してこれを実現する 1 つの方法を次に示します。

CREATE VOLATILE TABLE MyTable, NO FALLBACK
(MyID SMALLINT NOT NULL,
 MyColor VARCHAR(10) NOT NULL
)
PRIMARY INDEX (MyID)
ON COMMIT PRESERVE ROWS;

INSERT INTO MyTable VALUES (1, 'BLUE');
INSERT INTO MyTable VALUES (1, 'GREEN');
INSERT INTO MyTable VALUES (2, 'ORANGE');

SELECT *
  FROM MyTable;

SELECT MyID
     , CASE WHEN MyCount = 1
            THEN MyColor
            ELSE 'MULTIPLE'
       END AS MyNewColor
  FROM (SELECT MyID
             , MyColor
             , ROW_NUMBER() OVER (PARTITION BY MyID 
                                  ORDER BY MyColor)   AS MyRowNum
             , COUNT(*) OVER (PARTITION BY MyID)      AS MyCount
          FROM MyTable
        ) DT1
  WHERE MyRowNum = 1;

結果:

MyID  MyNewColor
----  ----------
2     ORANGE
1     MULTIPLE
于 2013-10-16T23:48:09.040 に答える