3
 Masterid    CC  CLA DES NLCLA   NLDES
 -------------------------------------
 53006141    CN  0   0   1       1
 53006141    US  1   1   1       1
 53006141    UK  1   1   0       0
 53006142    US  1   1   0       0
 53006142    UK  1   1   0       0
 53006143    CN  0   0   1       1
 53006143    US  1   1   0       0
 53006143    UK  1   1   0       0

上記のデータから私は生成する必要があります

  • orとandMasterIdsがある場所のリストCC = USCC = CNNLCLA = 1NLDES = 1

出力は次のようになります

53006141
53006143

MasterIDの下にCNとUSの両方が存在する必要があります。

誰かがSQLでこれを行うのを手伝ってもらえますか?

4

2 に答える 2

11

これを行うには、または:WHEREのいずれかで行を返す句を追加します。USCN

select distinct Masterid
from yourtable
where cc in ('US', 'CN')
  and NLCLA = 1
  AND NLDES = 1

SQL FiddlewithDemoを参照してください

CN結果にとの両方を含める場合はUS、次を使用できます。

select Masterid
from yourtable
where cc in ('US', 'CN')
  and NLCLA = 1
  AND NLDES = 1
group by masterid
having count(distinct cc) = 2

SQL FiddlewithDemoを参照してください。

これを行う別の方法は、を使用して、とEXISTSの両方を含むMasterIdのリストを取得することです。次に、他のフィルターをサブクエリではなく句に配置します。USCNWHERE

select distinct masterid
from yourtable t1
where exists (select Masterid
              from yourtable t2
              where cc in ('US', 'CN')
                and t1.masterid = t2.masterid
              group by masterid
              having count(distinct cc) = 2)
  and NLCLA = 1
  and NLDES = 1;

SQL FiddlewithDemoを参照してください

于 2013-02-12T15:13:03.487 に答える
1

1つの方法は、CTE:を使用することです。

WITH CTE AS
(
    SELECT Masterid,CC,CLA,DES,NLCLA,NLDES,
        RN = ROW_NUMBER() OVER (PARTITION BY Masterid ORDER BY Masterid)
    FROM dbo.Table
    WHERE   CC IN('US', 'CN')
    AND     NLCLA = 1
    AND     NLDES = 1
)
SELECT Masterid FROM CTE WHERE RN = 1

デモ(fiddle-dataのbluefeetに感謝)

ROW_NUMBER特定の行を取得する場合、たとえば、各行の最新のレコードを常に取得する場合は、パーティション関数が役立つことに注意してくださいMasterid。しかし、あなたがdatetime列を提供していないので、私はちょうど。によって任意に注文しましたMasterid

于 2013-02-12T15:14:54.167 に答える