【问题标题】:Duplicate rows because 1 column has multiple distinct values重复行,因为 1 列有多个不同的值
【发布时间】:2021-09-16 07:40:08
【问题描述】:

我正在运行 SELECT 查询以跨同一服务器实例中的多个表获取数据。但是,我刚刚注意到在某些数据上提取的行会重复,因为我从中提取的主表在其中一列中有几个不同的值。这是查询:

  SELECT DISTINCT BIF030.C_ACCOUNT AS ACCOUNTNUMBER,
    BIF003.C_ACCOUNTTYPE AS ACCOUNTTYPECODE,
    CON013.C_DESCRIPTION AS ACCOUNTTYPE,
    BIF003.C_DIVISION AS ZONE_DIVISONCODE,
    CON028.C_DESCRIPTION AS ZONE_DIVISION,
    BIF030.C_METER as METERNUMBER,
    BIF005.C_METERCUSTOM1 AS REGISTERNUMBER,
    CONVERT(DECIMAL(20,2), BIF030.N_CONSUMP) AS CONSUMPTION,       
    CON007.C_DESCRIPTION AS UNITS,       
    BIF030.T_READDATE AS READINGDATE,
    MONTH(BIF030.T_READDATE) AS READINGMONTH,
    DAY(BIF030.T_READDATE) AS READINGDAY,
    YEAR(BIF030.T_READDATE) AS READINGYEAR,
    BIF030.I_DAYS AS READINGDAYSCOUNT
    
      FROM ADVANCED.BIF030     
        LEFT JOIN ADVANCED.CON007 ON CON007.C_UNITS=BIF030.C_UNITS
        LEFT JOIN ADVANCED.BIF005 ON BIF005.C_METER=BIF030.C_METER
        LEFT JOIN ADVANCED.BIF003 ON BIF003.C_ACCOUNT=BIF030.C_ACCOUNT
        LEFT JOIN ADVANCED.CON013 ON CON013.C_ACCOUNTTYPE=BIF003.C_ACCOUNTTYPE
        LEFT JOIN ADVANCED.CON028 ON CON028.C_DIVISION=BIF003.C_DIVISION
        
    WHERE T_READDATE > '01-01-2014'
    
    ORDER BY ACCOUNTNUMBER, READINGDATE ASC

我知道 SELECT DISTINCT 不受欢迎,但没有它我会得到更多行。以下是拉取数据时的示例:

ACCOUNTNUMBER ACCOUNTTYPECODE ACCOUNTTYPE ZONE_DIVISIONCODE ZONE_DIVISION METERNUMBER REGISTERNUMBER CONSUMPTION UNITS READINGDATE READINGMONTH READINGDAY READINGYEAR READINGDAYSCOUNT
1234567 SP ACCOUNT TYPE 1 00 00-NO ZONE 123456789 987654321 3.00 Thousands of Gallons 2014-01-16 00:00:00.00 1 16 2014 30
1234567 MF ACCOUNT TYPE 2 02 02-GRAVITY 123456789 987654321 3.00 Thousands of Gallons 2014-01-16 00:00:00.00 1 16 2014 30
1234567 SR ACCOUNT TYPE 3 02 02-GRAVITY 123456789 987654321 3.00 Thousands of Gallons 2014-01-16 00:00:00.00 1 16 2014 30

我也知道搞砸的列是“AccountTypeCode”,因为没有与“AccountNumber”关联的多个代码的其他帐户只显示一组行。因此,当它应该只为每个“ReadingDate”拉一个时,这个(可能还有其他)特别是拉的行数增加了三倍。

如果有人知道优化查询的好方法,我很乐意学习。我知道足够多的 SQL 是危险的,但还不足以解决这个问题。谢谢。

【问题讨论】:

  • 当您想将多条记录压缩为一条时,您必须知道要使用的规则。您有 3 个不同的 AccountTypeCode - 您想要哪一个?
  • 所以我想我应该补充一点,在理想的结果中,“AccountTypeCode”将与关联的“ReadingDate”相关联。不深入很难解释,但基本上“AccountNumber”将始终相同,但“AccountTypeCode”可以更改。但是,“ReadingDate”将始终只与特定的“AccountTypeCode”相关联。
  • 在您的问题中包含示例数据和所需结果,以帮助说明您的问题并使其更容易和可能提供帮助。
  • 我附上了一张结果的照片(缩小到 3 行,实际上拉了 200 行),但我必须链接它(它不是嵌入的),因为我的帐户是新帐户。至于预期的结果,我应该只显示图中 3 行中的 1 行,而不是全部 3 行。编辑:在这种情况下,“Single Family Res Inside”行是它应该显示的唯一行,但它显示了 3 行链接的图片。
  • 编辑帖子以使用 Markdown 表作为结果。在此表中,类型 1 是唯一应该显示的类型

标签: sql sql-server tsql


【解决方案1】:

好的。好消息,我想添加这个,以防它在未来对其他人有所帮助。我发现由于ACCOUNTTYPECODEZONE_DIVISIONCODE 来自BIF003 表,我需要在WHERE 语句中添加更多内容。这就是为我解决的问题:

AND BIF030.C_CUSTOMER = BIF003.C_CUSTOMER

因为C_CUSTOMER 列不同(它是BIF003BIF030 表中的列)导致单独的ACCOUNTTYPECODE 结果我需要在WHERE 语句中检查它。

感谢大家让我开始思考这个问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-08-07
    • 2017-12-18
    • 2021-06-17
    • 2016-04-04
    • 1970-01-01
    • 1970-01-01
    • 2014-12-26
    • 2017-07-24
    相关资源
    最近更新 更多