2017-08-03 47 views
0

我不知道如何很好地将我的问题提出来,所以我将从返回的数据开始:将数据合并为单个单元格同时求和单元格

prop_id |评估值| sale_id

35004 | 401200 | 1920831

35005 | 40500 | 1920831

35023 | 11300 | 1920831

34380 | 139100 | 1915846

127959 | 286400 | 1915882

我想返回:

prop_id |评估值| sale_id

35004,35005,35023 | 453000(3个包裹的总和)| 1920831

34380 | 139100 | 1915846

127959 | 286400 | 1915882

所以我的主要目标是将sale_id字段中的所有包裹合并到一个字符串中,但仅当销售ID具有多个prop_id时,然后总结所有这些评估值。这是我使用,以获得第一组数据的查询......

select 
pv1.[prop_id], 
pv1.[assessed_val], 
ld1.[sale_id] 
from dbo.land_detail as ld1  
join dbo.property_val as pv1 on 
pv1.[prop_id] = ld1.[prop_id] and 
pv1.[prop_val_yr] = ld1.[prop_val_yr] and 
pv1.[sup_num] = ld1.[sup_num] 
left join dbo.sale as sale1 on 
sale1.[chg_of_owner_id] = ld1.[sale_id] 
where 
pv1.[prop_inactive_dt] is null 
order by sale_id, prop_id 

PROP_ID的数据类型为INT的
assessed_val的数据类型为数字的(14,0)
sale_id是数据类型INT

+1

请将您的“之前”数据以易耗品格式发布。数据的图片不是数据。 –

+0

发布您的原始数据结构,以及您期望的结果集看起来会很有帮助。 – Eli

+0

这个问题已经被问过很多次了。在mssql中使用Google“如何使用STUFF”功能 –

回答

0

您可以使用创建临时表,那么你可以使用的东西()FOR XML PATH来串联PROP_ID场成一排

WITH temp AS (
select pv1.[prop_id], 
     pv1.[assessed_val], 
     ld1.[sale_id], 
     sale1.[sl_price], 
     sale1.[sl_dt], 
     (pv1.[assessed_val]/NULLIF(sale1.[sl_price],0) as Ratio 
    from dbo.land_detail as ld1 with(nolock) 
    join dbo.property_val as pv1 with(nolock) 
    on pv1.[prop_id] = ld1.[prop_id] 
    and pv1.[prop_val_yr] = ld1.[prop_val_yr] 
    and pv1.[sup_num] = ld1.[sup_num] 
    left join dbo.sale as sale1 with(nolock) 
    on sale1.[chg_of_owner_id] = ld1.[sale_id] 
where sale1.sl_dt <= '04/30/16' 
    and sale1.sl_dt >= '05/01/15' 
    and pv1.[sub_type] = 'r' 
    and pv1.[prop_val_yr] = 2016 
    and pv1.[prop_inactive_dt] is null 
order by sale_id, prop_id 
) 

SELECT STUFF((SELECT ', ' + CAST(prop_id AS VARCHAR) 
       FROM temp 
       WHERE sale_id = t.sale_id 
       FOR XML PATH(''),TYPE) 
       .value('.','NVARCHAR(MAX)'),1,2,'') AS parcels, 
     SUM(t.assessed_val) assessed_val, 
     t.sale_id, 
     t.sl_price, 
     t.sl_dt, 
     SUM(t.ratio) ratio 
    FROM temp t 
GROUP BY t.sale_id, 
      t.sl_price, 
      t.sl_dt 
ORDER BY t.sale_id DESC 
+0

当我创建临时表时,它给了我这个错误:消息8134,级别16,状态1,行1 除以零遇到的错误。 该声明已被终止。 –

+0

当我尝试执行第二部分时,出现以下错误消息:消息245,级别16,状态1,行1 将varchar值“,”转换为数据类型为int时转换失败。 –

+0

我编辑了上面的代码来使用WITH代替INTO #temp。你能提供你的表结构来显示每一列的数据类型吗?我认为prop_id是数据类型INT? –

0

将所有内容放入临时表(#temp)中,如下所示。然后进行自加入以选择值。有几种使用(SUFF(),XML PATH等)进行连接的方法。关于如何连接行到逗号分隔字符串在互联网上搜索是指this链接,例如

select 
pv1.[prop_id], 
pv1.[assessed_val], 
ld1.[sale_id], 
sale1.[sl_price], 
sale1.[sl_dt], 
(pv1.[assessed_val]/sale1.[sl_price]) as Ratio 
--------Temp Table------------ 
INTO #temp 
------------------------------ 
from dbo.land_detail as ld1 with(nolock)  
join dbo.property_val as pv1 with(nolock) on  
pv1.[prop_id] = ld1.[prop_id] and 
pv1.[prop_val_yr] = ld1.[prop_val_yr] and 
pv1.[sup_num] = ld1.[sup_num] 
left join dbo.sale as sale1 with(nolock) on 
sale1.[chg_of_owner_id] = ld1.[sale_id] 
where 
sale1.sl_dt <= '04/30/16' and 
sale1.sl_dt >= '05/01/15' and 
pv1.[sub_type] = 'r' and 
pv1.[prop_val_yr] = 2016 and 
pv1.[prop_inactive_dt] is null 
order by sale_id, prop_id