具有相同ID的多个值的数据库

时间:2017-10-31 21:07:11

标签: sql database excel

我有一个数据库,其中每个实体都有一个唯一的ID,但最近所有的实体名称都被更改(不是以相同的方式)以提高可读性。这些更改在不同名称中不是标准的,因ID而异。这使得很多摘要报告如下所示:

ID     Name            Total for the year     
3011   Joesmith          3000
3011   Joe Smith         1000
5024   DBS               400
5024   Deborah Smith     150

各行可能类似于:

ID     Name          Transaction      Date
3011   Joesmith      2000             January 1, 2017   
3011   Joesmith      1000             January 2, 2017   
3011   Joe Smith     500              February 1, 2017
3011   Joe Smith     500              February 5, 2017

最好的方法是纠正旧条目以匹配新条目,还是只显示任何匹配ID的新名称?在一天结束时,我们可以通过使用ID获得我们感兴趣的摘要,但最终我们希望通过查看我们的名称来解释这些摘要。

我们正在查看大约1000个具有不同名称的ID,总共可能有50,000行。

3 个答案:

答案 0 :(得分:2)

选项A:使用每个ID的最新名称更新您的表格:

UPDATE A
SET A.Name = B.Name
FROM YourTable A
JOIN (SELECT ID, Name, ROW_NUMBER() OVER (PARTITION BY ID ORDER BY Date DESC) RN
      FROM YourTable) B ON A.ID = B.ID AND B.RN = 1

选项B:更改报表以加入表格以获取每个ID的最新名称。这是一种方式:

SELECT A.ID, B.Name, SUM(Transaction) TotalForTheYear
FROM YourTable A
JOIN (SELECT ID, Name, ROW_NUMBER() OVER (PARTITION BY ID ORDER BY Date DESC) RN
      FROM YourTable) B ON A.ID = B.ID AND B.RN = 1
GROUP BY A.ID, B.Name

这些使用ROW_NUMBER(),这在所有DBMS(主要是MySQL)中都不可用。如果ROW_NUMBER()不可用,还有其他方法可以编写它。 UPDATE语法也可能有所不同。始终在您的问题中标记或提及您的DBMS选项。

答案 1 :(得分:2)

此处的解决方案基于您希望设置为具有空格的名称的假设,并且您在帖子中列出的每个ID只有两个名称变体。它还假定MS SQL Server没有标记DBMS

如果您想使用没有空格的名称,请在>0子句中将=0更改为WHERE

UPDATE  your_table
SET     your_table.Name = a.Name
FROM    (
            SELECT  DISTINCT
                    ID,
                    Name
            FROM    your_table
        ) a
WHERE   CHARINDEX(' ', a.Name) > 0 AND
        your_table.ID = a.ID

我建议你在桌子的副本上测试一下

答案 2 :(得分:1)

虽然您可以更新数据,但更好的方法似乎是修复您的数据库,因此名称只能使用ID一次。然后,您应该从事务表中删除该名称,然后返回到具有该名称的实体。我意识到这可能不实用,但它比修复非规范化数据更正确