【发布时间】:2015-10-18 13:48:19
【问题描述】:
解释
假设这里有 3 家公司。我们通过Name 加入表格,因为并非每个员工都提供了他的PersonalNo。 StringId只有专家,也不能用于加盟。同一员工可以在多家公司工作。
问题
问题是可能有不同的员工同名(名字和姓氏相同,例如只提供名字)。
我需要什么?
数据有问题时返回1,如果正确则返回0。
检测问题的规则
- 当有多个相同的名称(2 或更多)并且都具有相同的
PersonalNo并且并非所有都具有StringId(作为彼得)应该返回1(错了) - 当有多个相同的名称(2 个或更多)并且有
NULL(参见 John),但它们都具有相同的StringId时应该返回0(没错,就是没有提供的公司之一PersonalNo) - 当有多个相同的名称(2 个或更多)并且所有
PersonalNo都相等并且所有StringId都相等时(参见 Lisa)它应该返回 @ 987654335@(正确) - 当有多个相同的名字(2 个或更多)并且有多个不同的
PersonalNo和所有StringId提供时应该是这样的:我们看到这里有 2 个不同的人 Jennifer 和@ 987654338@PersonalNo和 Jennifer 和4920225088PersonalNo,Jennifer 和NULLPersonalNo和 Jennifer 一样StringId和4920225088PersonalNo所以它应该返回 @9876543 ) 和4805250141PersonalNo的 Jennifer 不应该被选中,因为StringID并且只有 1 行具有相同的PersonalNo。 - 如果只有 1 行并且没有提供
StringId它根本不应该出现在选择中。
样本数据
Company Name PersonalNo StringId
Comp1 Peter 3850342515 85426 -------------------------------------------------------------------
Comp2 Peter 3850342515 '' -- If have the same PersonalNo and there is no StringId - 1 (wrong)
Comp1 John NULL 12345 ------------------------------------------------------------------
Comp2 John 3952525252 12345 -- If have the same StringId and 1 PersonalNo is NULL - 0 (correct)
Comp1 Lisa 4951212581 52124 ----------------------------------------------------------------
Comp3 Lisa 4951212581 52124 -- If PersonalNo are equal and StringId are equal - 0 (correct)
Comp1 Jennifer 4805250141 '' -----------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Comp1 Jennifer 4920225088 55443 -- If have 2 different PersonalNo and NULL PersonalNo, but where PersonalNo is NULL
Comp3 Jennifer NULL 55443 -- Have the same StringId with other row where is provided PersonalNo it should be 0 (correct), with different PersonalNo where is no StringId shouldn't appear at all.
Comp1 Ralph 3961212256 '' -- Shouldn't appear in select list, because only 1 row with this PersonalNo and there is no StringID
期望的输出
Peter 1
John 0
Lisa 0
Jennifer 0
查询
LEFT JOIN (SELECT Name,
(
SELECT CASE WHEN MIN(PersonalNo) <> MAX(d.PersonalNo)
and MIN(CASE WHEN StringId IS NULL THEN '0' ELSE StringId END) <> MAX(CASE WHEN d.StringId IS NULL THEN '0' ELSE d.StringId END) -- this is wrong
and MIN(PersonalNo) <> ''
and MIN(PersonalNo) IS NOT NULL
and MAX(rn) > 1 THEN 1
ELSE 0
END AS CheckPersonalNo
FROM (
SELECT Name, PersonalNo, [StringId], ROW_NUMBER() OVER (PARTITION BY Name, PersonalNo ORDER BY Name) rn
FROM TableEmp e1
WHERE Condition = 1 and e1.Name = d.Name
) sub2
GROUP BY Name
) CheckPersonalNo
FROM [TableEmp] d
WHERE Condition = 1
GROUP BY Name
) f ON f.Name = x.Name
查询的问题是我只能按Name 分组,不能将PersonalNo 添加到GROUP BY 子句,所以我需要在选择列表中使用聚合。但是现在它只比较 MIN 和 MAX 值,如果有超过 2 行具有相同的名称它不能按预期工作。
我需要做类似的事情,比较 PARTITION BY Fullname, PersonalNo 的值。它现在将值与相同的Name 进行比较(不依赖于PersonalNo)。
有什么想法吗?如果您有任何问题 - 问我,我会尽力解释。
更新 1
如果有两个PersonalNo不同的条目,但它们的StringId相等,则应该是1(错误)。
Company Name PersonalNo StringId
Comp1 Anna 4805250141 88552 -- different PersonalNo and the same StringId for both should go as 1 (wrong)
Comp1 Anna 4920225088 88552
现在它返回如下:
Anna 0
Anna 0
应该是:
Anna 1
更新 2
在UNION 更新Identifier 列后返回StringId: 55443(用于下面的数据),但在这种情况下,当1 个条目具有PersonalNo,另一个是blank,但它们都具有相同的(相等)StringId是正确的(应该是0)
Comp1 Jennifer 4920225088 55443
Comp3 Jennifer '' 55443
【问题讨论】:
-
只有3家公司吗?名字是固定的吗?
-
不,有数百家公司和数百万员工。 It is wrong的情况可以有更多,但我会自己做,我只需要Idea,如何按Name,PersonalNo进行分区比较,也可以根据PersonalNo比较值。
-
PersonalNo 可以不同(非空)但 stringid 相同,反之亦然吗?
-
@Sameer 是的,可以,所以在这种情况下它应该返回 1(错误)。
标签: sql sql-server sql-server-2008 tsql group-by