2017-08-03 48 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