iT邦幫忙

0

請問如何抓出 '20歲以下' 佔總會數前25% 的所有總會數跟總資產和平均資產和人數?

想請問以下語法如何抓出 '20歲以下' 佔總會數前25% 的所有總會數跟總資產和平均資產~ 因為以下語法是列出依總會數排序將所有的資料一筆一筆列出~但我希望是佔前25%的加總><
SELECT TOP 25 percent case when (SUBSTRING(生日,1,4)) BETWEEN 1998 AND 2018 then '20歲以下' end as '年齡'
,sum(總會數) as '總會數'
,sum(總資產/10000) as '總資產(萬)'
,sum(總資產/10000)/count() as '平均資產'
,count(
) as '人數'
FROM [dbo].[VW_BS_會員基本資料1] JOIN SPL_DIS..PRT429 AS O1 on 身份證字號=會員編號
WHERE '年齡' IN ( SELECT '年齡'
FROM [dbo].[VW_BS_會員基本資料1] JOIN SPL_DIS..PRT429 AS O2 on 身份證字號=會員編號
WHERE o2.總資產 = o1.總資產
ORDER BY [總資產] DESC)
AND (生日 <> null or 生日<>'') and (SUBSTRING(生日,1,4))>1998 and (SUBSTRING(生日,1,4))<2018 and 客服姓名<>'未分配'
GROUP BY case when (SUBSTRING(生日,1,4)) BETWEEN 1998 AND 2018 then '20歲以下' end ,總資產
ORDER BY 總會數 DESC
https://ithelp.ithome.com.tw/upload/images/20181120/20111204alF1pJQmcW.png
這是上面語法跑出來的資料,但是他是逐一列出顯示
但是我希望資料可以跑出的是像下面這樣
https://ithelp.ithome.com.tw/upload/images/20181120/20111204O5I54uRe9I.png
是佔前25%的加總~

看更多先前的討論...收起先前的討論...
石頭 iT邦研究生 3 級 ‧ 2018-11-19 21:55:17 檢舉
麻煩提供一些樣本數據和期望輸出 謝謝
這個標題...是內容吧!
小魚 iT邦高手 1 級 ‧ 2018-11-20 07:45:02 檢舉
這標題好長
debbie5 iT邦新手 5 級 ‧ 2018-11-20 08:50:49 檢舉
各位大大,我已經將原本輸出和期望輸出秀出囉

1 個回答

1
rogeryao
iT邦研究生 1 級 ‧ 2018-11-19 22:47:46
最佳解答

1.假設原 SQL 是對的
2.其中"平均資產"改用 sum(CC)/sum(EE),而未使用 sum(DD) <= 可能不合理


SELECT AA as '年齡',
sum(BB) as '總會數',
sum(CC) as '總資產(萬)',
round(sum(CC)/sum(EE),0) as '平均資產',
sum(EE) as '人數'
FROM (
SELECT TOP 25 percent case when (SUBSTRING(生日,1,4)) BETWEEN 1998 AND 2018 then '20歲以下' end as 'AA'
,sum(總會數) as 'BB'
,sum(總資產/10000) as 'CC'
,count() as 'EE'
FROM [dbo].[VW_BS_會員基本資料1]
...略
ORDER BY 總會數 DESC
) AS TempTable
where 1=1
group by AA
having sum(EE) >0

看更多先前的回應...收起先前的回應...
rogeryao iT邦研究生 1 級 ‧ 2018-11-20 09:15:25 檢舉

原 SQL 應可優化:
1.以下應該可去除
'年齡' IN ( SELECT '年齡'
FROM [dbo].[VW_BS_會員基本資料1] JOIN SPL_DIS..PRT429 AS O2 on 身份證字號=會員編號
WHERE o2.總資產 = o1.總資產
ORDER BY [總資產] DESC)
2.
生日 <> null
改為 生日 is not null
3.
case when (SUBSTRING(生日,1,4)) BETWEEN 1998 AND 2018 then '20歲以下' end
改為
case when SUBSTRING(生日,1,4)>1998 and SUBSTRING(生日,1,4)<2018 then '20歲以下' end

debbie5 iT邦新手 5 級 ‧ 2018-11-20 09:49:24 檢舉

rogeryao
謝謝您的指導~!
剛剛沒注意到9點多你還有回復,優化的部分我再來修改~~感謝您~

rogeryao iT邦研究生 1 級 ‧ 2018-11-20 10:41:03 檢舉

錯誤訊息 行 77 => 那行 ...前後是否有多的單引號
另外 , round(sum(CC)/sum(EE),0) as '平均資產',

rogeryao iT邦研究生 1 級 ‧ 2018-11-20 20:29:42 檢舉

1.因為你已經下好 SQL (類似明細表)才要做 sum ,大概就是這樣解.
2.可能還有一種解法更好,就是把你原本的 group 跟 sum 去除 , 只在最外層做一次 group 跟 sum ;這樣就不用做兩次 group 跟 sum

debbie5 iT邦新手 5 級 ‧ 2018-11-21 11:54:36 檢舉

rogeryao 非常的感謝你哦~
我昨天有做出來了

https://ithelp.ithome.com.tw/upload/images/20181121/20111204fNciDezkhC.png

我要發表回答

立即登入回答