如何操纵SQL中的值并获得新的结果?
问题描述:
我有这个疑问:如何操纵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)
我想,也许一个子查询可以帮助!
任何帮助或想法将不胜感激!
答
以下是一些测试数据,以便在未来模拟您的环境,您应该将涉及的表格和测试数据分开。包括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
这是伟大的马特! 我真的很欣赏你的伟大解释! –
您的Select语句在表格之间没有关系。请使用该信息更新您的帖子。 – Matt
Yuuuuupppssss!对于那个很抱歉! 谢谢! –
拥有“ID”列有什么意义? – BJones