1

Student ( STU) & Programs ( PGM) テーブルをクエリし、 ごとに複数のレコードIDがある場合でも、 ごとに1 つの結合されたレコードを返す必要があります。を使おうと思ったのですが、集計関数でもGROUP BY句でもないので、 での 使い方がわかりません。PGMIDGROUP BY STU.ID, STU.FN, STU.LNPGM.CDSELECT

テーブルにはPGMレコードがある場合とない場合があります。以下の私のクエリは、これらの可能な結果を​​返します。

  1. PGMレコードがない場合、1 つの結果のみIDが返され、PGM.CD列がNULL(または''ごとにCASE) 返されます。
  2. PGMテーブルにレコードが 1 つしかなく、 PGM.CD = 200 ('DLA'ごとにCASE) の場合、ごとに 1 つの結果のみIDが返されます。
  3. PGMテーブルにレコードが 1 つしかなく、 PGM.CD <> 200 (''ごとにCASE) の場合、ごとに 1 つの結果のみIDが返されます。
  4. PGMテーブルに ( ごとに) 複数のレコードがある場合ID、つまり 121、200、156 の場合、 ごとに複数の行が生成されますID

ID列の結果を組み合わせて、ごとに 1 行のみを返すクエリが必要PGM.CDです。PGM.CD列は''or 200( 'DLA'per CASE)のみを返す必要があります

SELECT STU.ID, STU.FN, STU.LN,
  CASE PGM.CD
    WHEN '200' THEN 'DLA'
    ELSE ''
  END
FROM STU
LEFT JOIN PGM
  ON STU.ID = PGM.PID

これは私のクエリが返すものです(変更なしCASEPGM.CD

STU.ID  STU.FN  STU.LN  PGM.CD  
1000    Bruce   Wayne   NULL  
1001    Clark   Kent    200  
1002    Barry   Allen   151  
1002    Barry   Allen   101  
1003    Hal     Jordan  126  
1003    Hal     Jordan  200  
1003    Hal     Jordan  101

これは私のクエリが返すものです(変更CASEあり)PGM.CD

STU.ID  STU.FN  STU.LN  PGM.CD  
1000    Bruce   Wayne   
1001    Clark   Kent    DLA
1002    Barry   Allen   
1002    Barry   Allen   
1003    Hal     Jordan  
1003    Hal     Jordan  DLA
1003    Hal     Jordan  

これを返す必要があります:

STU.ID  STU.FN  STU.LN  PGM.CD
1000    Bruce   Wayne   
1001    Clark   Kent    DLA
1002    Barry   Allen   
1003    Hal     Jordan  DLA

これがすべて理にかなっていることを願っています。助けてくれてありがとう。

アンソニー

4

3 に答える 3

2

次のような単純なクエリを使用する必要があります。

   WITH CTE_PGM
    AS
    (
        SELECT PGM.PID, MAX(  CASE PGM.CD
        WHEN '200' THEN 'DLA'
        ELSE ''
        END) AS MaxCD
        FROM PGM
        GROUP BY PGM.PID
    )
    SELECT STU.ID, STU.FN, STU.LN, MaxCD
    FROM  STU
    INNER JOIN CTE_PGM ON STU.ID = CTE_PGM.PID

SQL Fiddle(!) を使用してみてください。これは、迅速な回答に大きな助けとなります。

どのように機能するのか、例を作成しました。確認してください。

于 2012-08-29T04:33:01.893 に答える
0
SELECT STU.ID, STU.FN, STU.LN,
  max(CASE PGM.CD
    WHEN '200' THEN 'DLA'
    ELSE '')
  END
FROM STU
LEFT JOIN PGM
  ON STU.ID = PGM.PID
group by  STU.ID, STU.FN, STU.LN
于 2012-08-29T05:14:15.590 に答える
0

以下のクエリを使用します。

SELECT STU.ID, STU.FN, STU.LN, ISNULL(Max( Case When PGM.CD = 200 then 'DLA' Else '' End), '') as PGM_CD
FROM  STU
Left JOIN PGM ON STU.ID = PGM.PID
Group by STU.ID, STU.FN, STU.LN 
于 2012-08-29T05:09:53.067 に答える