2016-09-20 9 views
1

私はこのクエリを持っている:SQLで値を操作して新しい結果を得る方法は?

SELECT 
    c.ID, c.Firstname, c.lastname, c.BDaY, c.gender, 
    cp.code, cp.Citizenship, r.race, e.ethnicity 
FROM 
    Client AS C (nolock) 
JOIN 
    Citizenship AS cp (nolock) ON c.ID = cp.client_ID 
JOIN 
    Race AS r (nolock) ON c.ID = R.Client_ID 
JOIN 
    Ethnicity AS E (nolock) ON E.Client_ID = c.ID 

彼らは異なる人種や民族性を持っているため、このクエリは重複し、クライアントの名前のいくつかを返します。

例:レースがない場合は言うことはどのような方法があるかどう人種多民族ことと民族が同じIDのために=お互いにされていない場合は、最後の更新いずれかを選択しなければならないよりも、

ID |FirstName|Lastname| BDay | gender | code |citizenship| race | ethnicity 
    1 Pedram Salamati 01-20-1998 M  1  US citizen Middle-east  Spanish 
    1 Pedram Salamati 01-20-1998 M  1  US Citizen Middle-east  unknown 
    1 Pedram Salamati 01-20-1998 M  1  US Citizen Middle-east  Brazilian 
    2 Jesse  Albert 03-05-1982 F  1  US Citizen African   not Spanish 
    2 Jesse  Albert 03-05-1982 F  1  US Citizen American  not Spanish 

私は=思っていました。

PS.Ethnicityはタイムスタンプを持っていると私は多分サブクエリを助けることができると思いMax(e.LastUpdate)

を使用することができます!

ご協力いただきありがとうございます。

+1

Selectステートメントはテーブル間の関係がありません。その情報で投稿を更新してください。 – Matt

+0

ユアウォップ!それについて申し訳ありません!感謝! ありがとう! –

+0

'ID'列を持つことのポイントは何ですか? – BJones

答えて

1

今後、お使いの環境を模倣するいくつかのテストデータがあり、関連するテーブルとテストデータを分離する必要があります。 DMLステートメントを含む適切な情報が適切かつ有用であるため、人々は回答する前にソリューションを試すことができます。当然の

次の操作を行うことができ、これらの変数で
DECLARE @Client AS TABLE (ID INT, Firstname VARCHAR(25), LastName VARCHAR(25), BDay DATE, Gender CHAR(1)) 
INSERT INTO @Client VALUES (1,'Pedram','Salamati','01-20-1998','M') 
,(2,'Jesse','Albert','03-05-1982','F') 
DECLARE @Citizenship AS TABLE (Client_ID INT, Code INT, Citizenship VARCHAR(100)) 
INSERT INTO @Citizenship VALUES (1,1,'US citizen'),(2,1,'US citizen') 
DECLARE @Ethnicity AS TABLE (Client_ID INT, Ethnicity VARCHAR(50)) 
INSERT INTO @Ethnicity VALUES (1,'Spanish'),(1,'unknown'),(1,'Brazilian'),(2,'not Spanish') 
DECLARE @Race AS TABLE (Client_Id INT, Race VARCHAR(50), LastUpdate DATETIME) 
INSERT INTO @Race VALUES (1,'Middle-east',GETDATE()),(2,'African',GETDATE()),(2,'American',GETDATE() -1) 

、そこには、これは単に私はいくつかの理由のために選択しています1つの方法である1つの以上の方法である:

;WITH cteEthnicity AS (
    SELECT 
     e.Client_ID 
     ,CASE WHEN COUNT(DISTINCT e.Ethnicity) > 1 THEN 'Multiracial' ELSE MIN(e.Ethnicity) END as Ethnicity 
    FROM 
     @Ethnicity e 
    GROUP BY 
     e.Client_ID 
) 

, cteRace AS (
    SELECT 
     r.Client_Id 
     ,r.Race 
     ,ROW_NUMBER() OVER (PARTITION BY r.Client_Id ORDER BY r.LastUpdate DESC) as RowNumber 
    FROM 
     @Race r 
) 

SELECT 
    c.ID 
    ,c.Firstname 
    ,c.lastname 
    ,c.BDaY 
    ,c.gender 
    ,cp.code 
    ,cp.Citizenship 
    ,r.race 
    ,e.ethnicity 
From 
    @Client AS C --(nolock) 
    Join @Citizenship as cp --(nolock) 
    on c.ID = cp.client_ID 
    Join cteRace as r --(nolock) 
    ON c.ID = R.Client_ID 
    AND r.RowNumber = 1 
    Join cteEthnicity as E --(nolock) 
    ON E.Client_ID = c.ID 

あなたはとの2問題1を表示しました人種と1人民族と

  • エスニシティの場合:どの民族性を割り当てるのかを決定するために集約を使用します。これはウィンドウ関数でも行うことができますが、ここで私が書いた方法ではEthnicityテーブルにも存在する重複を考慮に入れます。レースのため

  • :あなたは単にあなたがそれを生成し、それが結合文

第三号の1に等しい場所を選択しROW_NUMBER()関数を使用することができ、クライアントで仕切られた最新の行をしたいですあなたは指摘していませんでしたが、一部の国では可能かもしれませんが、とにかくデュアル・シチズンシップです。その場合は、レースと同様の方法を使用できます。

注意Common Table Expressions [CTE]が使用されていても、サブセレクトとしてそれらを実際にネストすることもできます。

+0

これは素晴らしいマットです! 本当にありがとうございました! –

関連する問題