TSQL从行显示最大的Parcel#

时间:2017-10-25 16:02:48

标签: sql sql-server-2008 tsql sql-server-2012

我的数据看起来像这样。

enter image description here

Select distinct 
    x.[PropertyBasics.PK Resnet Property ID], x.filname, 
    c.mv_30day_value '30 Day Value As Is', 
    c.mv_30day_repvalue '30 Day Value Repaired', 
    t.parcel 'Parcel#',x. * 
from 
    Resnet_Reporting_ops.dbo.Ops_FullExportFLATV3 as X (NOLOCK) 
left join 
    resnet_mysql.dbo.form_tax t (nolock) on x.[PropertyBasics.PK Resnet Property ID] = t.property_id
left join 
    resnet_mysql.dbo.form_fm c (nolock) on t.task_id = c.task_id
where 
    X.[PropertyBasics.Property Basics - ResID] = 217 
    and x.[PropertyBasics.PK Resnet Property ID] = 1153829

如何让这些数据只显示Parcel#的1条记录?

enter image description here

1 个答案:

答案 0 :(得分:0)

select distinct测试整个行以查看它是否是唯一的。任何列中最小的差异都会使行“不同”。以下2个值不同,因此将导致2行

  1. 741722064100000
  2. 741-722-06-41-00000
  3. 并且以下2个值对不同,这会导致另外2行:

    1. 500000 800000
    2. 435000 850000
    3. 所有组合成4行。

      因此,看起来我们可以从上面的数据项2中删除破折号,这将使它与数据项1相等。

      replace(t.parcel,'-','') AS [Parcel#]
      

      但这总是如此吗?在此处未显示的其他行中是否存在其他差异?

      我们如何决定值对3.或4.? MAX()无效。例如

      MAX(c.mv_30day_value), MAX(c.mv_30day_repvalue)
      

      会产生

      500000 8500000
      

      并且源数据中不存在该组合

      达到预期结果所需的逻辑没有明确定义。

      尝试以下方法:

      SELECT
              x.[PropertyBasics.PK Resnet Property ID]
            , x.filname
            , MAX(c.mv_30day_value)     "30 Day Value As Is"
            , MAX(c.mv_30day_repvalue)  "30 Day Value Repaired"
            , replace(t.parcel,'-','')  "Parcel#"
      
            -- , x.* NO WAY !!
      
      FROM Resnet_Reporting_ops.dbo.Ops_FullExportFLATV3 AS X
      LEFT JOIN resnet_mysql.dbo.form_tax t ON x.[PropertyBasics.PK Resnet Property ID] = t.property_id
      LEFT JOIN resnet_mysql.dbo.form_fm c ON t.task_id = c.task_id
      WHERE X.[PropertyBasics.Property Basics - ResID] = 217
      AND x.[PropertyBasics.PK Resnet Property ID] = 1153829
      GROUP BY
              x.[PropertyBasics.PK Resnet Property ID]
            , x.filname
            , replace(t.parcel,'-','')
      ;
      

      请注意。对于GROUP BY,x.*不可行,因为您需要指定列将定义每个唯一行。对于每个额外的输出列,x.*与“select distinct”相反也会产生效果,增加了更多行的可能性。 (即通常更多列=更多差异=更多行)。同样如上所述,怀疑MAX()在这里产生了良好的结果。