-6

IDを持つテーブルがあります:

--FIRST TABLE--
| IDCLIENT |    DATE    |
   112102    2013-10-11

以下のテーブルには、常に最初のテーブルの ID が含まれます。

--SECOND TABLE--
| IDCLIENT | VALUE | OTHERCOLUMNS
   112102     50
   112103     30

ただし、この別のテーブルには最初のテーブルの ID がない場合があります。

--THIRD TABLE--
| IDCLIENT | VALUE | OTHERCOLUMNS
   112102     10

ID が 2 番目のテーブルにある場合は、その行を選択します。ID が両方のテーブルにある場合、3 番目のテーブルの行だけを選択します。どうすればそれを達成できますか?結合を使用してみましたが、成功しませんでした。

アップデート

VALUE 列の値を SUM() したい。

4

3 に答える 3

0

「ID が 2 番目のテーブルにある場合、その行を選択したい。ID が両方のテーブルにある場合、2 番目のテーブルの行のみを選択したい」タイプミスあると思います。これは、常に 2 番目のテーブルから選択し、3 番目のテーブルからは選択しないことを意味します。

したがって、一致する ID がある場合は 3 番目から選択したいと思います。それ以外の場合は、2 番目を「フォールバック」テーブルとして使用します。

EXISTSで使用できますCASE

SELECT t1.IDCLIENT,
       CASE WHEN EXISTS(SELECT 1 FROM dbo.Table3 t3 
                       WHERE t3.IDCLIENT = t1.IDCLIENT)
       THEN (SELECT TOP 1 t3.Value FROM dbo.Table3 t3 
             WHERE t3.IDCLIENT = t1.IDCLIENT)
       ELSE (SELECT TOP 1 t2.Value FROM dbo.Table2 t2
             WHERE t2.IDCLIENT = t1.IDCLIENT)
       END AS Value
FROM dbo.Table1 t1

VALUE 列の値を SUM() したい。

次に、上記のクエリで次のようなサブクエリを使用できます。

SELECT SUM(X.Value) FROM(
  SELECT t1.IDCLIENT,
         CASE WHEN EXISTS(SELECT 1 FROM dbo.Table3 t3 
                         WHERE t3.IDCLIENT = t1.IDCLIENT)
         THEN (SELECT TOP 1 t3.Value FROM dbo.Table3 t3 
               WHERE t3.IDCLIENT = t1.IDCLIENT)
         ELSE (SELECT TOP 1 t2.Value FROM dbo.Table2 t2
               WHERE t2.IDCLIENT = t1.IDCLIENT)
         END AS Value
  FROM dbo.Table1 t1
) X

Demo

于 2013-10-14T13:38:47.890 に答える
0

そこに LEFT JOIN が必要なようです。

ここでそれを読んでください

于 2013-10-14T13:38:53.280 に答える