2016-09-20 38 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 |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 

我想知道是否有任何方式说,如果比赛是不是=比赛应该是多种族,如果种族是不是=对方为同一ID选择最后更新的一个。

PS.Ethnicity具有时间标记,我可以使用Max(e.LastUpdate)

我想,也许一个子查询可以帮助!

任何帮助或想法将不胜感激!

+1

您的Select语句在表格之间没有关系。请使用该信息更新您的帖子。 – Matt

+0

Yuuuuupppssss!对于那个很抱歉! 谢谢! –

+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路,我选择的几个原因:你2显示问题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 

种族和1与种族

  • 对于种族:你想要使用聚合来确定要分配的种族。这也可以通过窗口函数来完成,但是我在这里编写它的方式会计入重复项,即使在种族表中也是如此。

  • 对于种族:你只是想在最新的行通过客户端,您可以使用ROW_NUMBER()函数生成后,分配选择它在连接语句

第三个问题等于1是你没有指出,但在一些国家可能是可能的是双重国籍。在这种情况下,你可以使用类似于Race的方法。

即使使用公用表表达式[CTE],也可以实际将它们嵌套为子查询。

+0

这是伟大的马特! 我真的很欣赏你的伟大解释! –