【问题标题】:SQL query to merge the repeated values in teh output用于合并输出中重复值的 SQL 查询
【发布时间】:2022-01-13 19:56:21
【问题描述】:

我在查询中使用不同的计算并将其组合以获得输出。查询有点像 -

select person_number,
sum(hours_spent),
sum(hours_amount),
hour_type,
sum(unpaid_spent),
sum(unpaid_amount),
unpaid_type
sum(total_amount_paid)
from 
(
select calc_card.hours_spent,
calc_card.hours_amount,
calc_card.unpaid_spent,
calc_card.unpaid_amount,
calc_card.total_amount_paid,
calc_card.time_card_start_date,
papf.person_id person_number 
from per_all_people_f papf,
calculations_time_spent calc_card
where papf.person_id = calc_card.person_id
and calc_card.Calculation_for = 'TimeSpent'
)
group by 
person_number,
hour_type,
unpaid_type

UNION 

select person_number,
sum(hours_spent),
sum(hours_amount),
hour_type,
sum(unpaid_spent),
sum(unpaid_amount),
unpaid_type
sum(total_amount_paid)
from 
(
select calc_card.hours_spent,
calc_card.hours_amount,
calc_card.unpaid_spent,
calc_card.unpaid_amount,
calc_card.total_amount_paid,
calc_card.time_card_start_date,
papf.person_id person_number 
from per_all_people_f papf,
calculations_time_spent DEcalc_card
where papf.person_id = calc_card.person_id
and calc_card.Calculation_for = 'ProcessedTimeSpent'
and DEcalc_card.absence_type in (select distinct absence_type from abs_table where absence_name like '%Premium%')
)

现在这给了我这样的输出 -

person_number   hours_spent     hours_amount    hour_type       unpaid_spent        unpaid_amount       unpaid_type         total_amount_paid       
1980                8               100          Manual             2                 8                  Computer               89
1980                8               100          Manual             1                 10                 Manual                 90
1980                8               100          Manual             

1981               9                60           Automatic          9                700                 Manual                10
1981               9                60           Automatic          9                700                 Manual                10
1981               9                60           Automatic       19               701                Withdrawn             10

那么对于一个人来说,如果 hours_spent 和 hours_amount 相同并且 unpaid_spent, unpaid_type 相同,那么它应该只在输出中出现一次。有点像 -

person_number   hours_spent     hours_amount    hour_type       unpaid_spent        unpaid_amount       unpaid_type         total_amount_paid       
1980                8               100          Manual             2                 8                  Computer               89
1980                                              Manual            1                 10                 Manual                 90
1980                                               Manual               

1981               9                60           Automatic          9                700                 Manual                10
1981                                             Automatic                                               Manual                10
1981                                           Automatic            19               701                 Withdrawn             10       

无论如何,这可以通过分区来实现吗?

【问题讨论】:

标签: sql oracle


【解决方案1】:

您可以尝试使用 CTE 和 Lag -

例子-

With data AS(
  YOUR EXISTING QUERY
)

,

datalagged as (
SELECT
data.*,
person_number
LAG(hours_spent,1) OVER(PARTITION BY person_number) as hours_spent_lag,
-----(for all columns you're wanting)
FROM data
)

SELECT 
person_number,
CASE WHEN hours_spent = hours_spent_lag 
     THEN '' --(or NULL) 
     ELSE hours_spent END AS hours_spent,
-----(for all columns you're wanting)
FROM datalagged;

这里的挑战是,如果您的数据没有像示例中所示的那样干净排序,您需要在分区和最终查询中按顺序添加,但看起来您没有任何键让这一切变得容易的价值观。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-20
    • 1970-01-01
    相关资源
    最近更新 更多