我需要一些帮助,为以下要求编写SQL语句(FINAL REULT)。
注意:我正在使用SQL语法在SAP HANA系统(数据库)上编写此SQL。 SQL语法通常被普遍使用。
用于列名的一些缩写:
cust = customer
ctry = country
mth = month
HCostPP = Highest cost per period
HCtryPP = highest country per period
HCostAP = Highest cost over all periods
HCtryAP = highest country over all periods
我的源表中有粒度数据。通过编写如下的SQL,我得到了聚合数据:
SELECT distinct cust,ctry,mth,sum(cost)
FROM mytable
GROUP BY cust,ctry,mth
I get aggregated data like which i used further to get my required results:
cust ctry mth cost
c001 US 201506 -100
c001 DK 201506 -100
c001 DE 201506 -50
c001 FR 201507 -200
c001 UK 201507 -50
最终要求的结果我希望实现如下所示:
cust ctry mth cost HCostPP HCtryPP HCostAP HCtryAP
c001 US 201506 -100 -100 DK -200 FR
c001 DK 201506 -100 -100 DK -200 FR
c001 DE 201506 -50 -100 DK -200 FR
c001 FR 201507 -200 -200 FR -200 FR
c001 UK 201507 -50 -200 FR -200 FR
所需结果的说明
based on data group (cust,ctry,mth) need to get for which
country COST were hightest 'within each month' (HCostPP , HCtryPP)
and then again 'over all months'(HCostAP , HCtryAP).
CATCH
for month 201506, -100 cost is same for both US and DK.
In this case take either one e.g. DK or US (i am showing above to take DK)
我做了什么:
我知道需要两个左连接。第一个左连接应该如下所示得到HCostPP,HCtryPP:
LEFT SIDE RIGHT SIDE
cust ctry mth cost cust ctry mth cost
c001 US 201506 -100 c001 DK 201506 -100
c001 DK 201506 -100 c001 FR 201507 -200
c001 DE 201506 -50
c001 FR 201507 -200
c001 UK 201507 -50
为了得到RIGHT SIDE表,当我写SQL时:
SELECT cust,ctry,mth, MIN(cost)
FROM
(
SELECT distinct cust,ctry,mth,sum(cost)
FROM mytable
GROUP BY cust,ctry,mth
)
GROUP BY cust,ctry,mth
i don't get the required result, i get:
cust ctry mth cost
c001 US 201506 -100
c001 DK 201506 -100
c001 DE 201506 -50
c001 FR 201507 -200
c001 UK 201507 -50
if i do like:
SELECT cust,mth, MIN(cost)
FROM
(
SELECT distinct cust,ctry,mth,sum(cost)
FROM mytable
GROUP BY cust,ctry,mth
)
GROUP BY cust,mth
then i get below and i lose 'cntry' column:
cust mth cost
c001 201506 -100
c001 201507 -200
如果我使用INNER JOIN获取'cntry'列:
SELECT cust,mth,ctry,cost FROM mytable AS 'main'
INNER JOIN (
SELECT cust,mth, MIN(cost) as cost1
FROM
(
SELECT distinct cust,ctry,mth,sum(cost)
FROM mytable
GROUP BY cust,ctry,mth
)
GROUP BY cust,mth ) AS 'sub'
ON main.cust=sub.cust, main.mnth=sub.mnth, main.cost=sub.cost1
then this gives me what is also not desired as
it is giving me both rows i.e. for US and DK and i need only one here:
cust ctry mth cost
c001 US 201506 -100
c001 DK 201506 -100
c001 FR 201507 -200
我感谢您在编写SQL以获得上述所需结果方面的任何帮助(最终要求的结果部分)。
感谢您的帮助./Regards/NOMAN
答案 0 :(得分:0)
这是第一部分,对于PerPeriod结果,您应该使用over(partion by)构造(这是非常好的here。
select
t1.cust,
t1.ctry,
t1.mth,
t1.cost,
(select t3.ctry from mytable t3 order by t3.cost asc limit 1) HCtryAP,
min(t2.cost) HCostAP
from mytable t1, mytable t2
group by 1,2,3
order by 3, 4;