Oracle即使没有找到数据也需要返回设置的行数

时间:2018-04-09 11:10:55

标签: c# sql oracle

目前我有一个oracle查询查询某些数据,并根据结果将它们分组到#34; buckets"。无论是否找到数据,都应该有这些存储桶的静态数量。

{ "Within 5 days", "6-10 days", "11-15 days", "15-20 days", "21-25 days", "26-30 days", "> 30 days" }

为了处理这种情况,我正在使用LINQ查询,其字符串数组是我的" bucket"名称并将它们映射回查询结果。如果没有找到记录,我只是创建一个新对象,并使用适当的桶标题名称将所有值设置为0(即"在5天内#34;)。

我想要做的就是在没有任何C#代码的情况下处理这个问题并让oracle查询返回带有硬编码头的空行。我的局限是我不是Oracle的专家,我也不想影响性能,所以我一直在努力处理这种情况的正确和最好的方法。

如果修改下面的查询,是否有办法严格完成此操作,即使没有符合条件的数据,也始终返回case语句值?我知道我可以做一个联盟,但我只在一行中看到这个例子而不是我需要返回多少。下面的查询是我正在运行的查询的简化版本。还有5个额外的列可以汇总财务数据。

   Select lag_time, NUM_DAYS
      FROM
         (SELECT  
            CLM.reported_date - CLM.loss_date as NUM_DAYS
          , CASE WHEN NVL(CLM.reported_date - CLM.loss_date,0) <= 5 THEN 'Within 5 days'
                 WHEN NVL(CLM.reported_date - CLM.loss_date,0) between 6 and 10 THEN '6-10 days'
                 WHEN CLM.reported_date - CLM.loss_date between 11 and 15 THEN '11-15 days'
                 WHEN CLM.reported_date - CLM.loss_date between 16 and 20 THEN '16-20 days'
                 WHEN CLM.reported_date - CLM.loss_date between 21 and 25 THEN '21-25 days'
                 WHEN CLM.reported_date - CLM.loss_date between 26 and 30 THEN '26-30 days'
                 WHEN CLM.reported_date - CLM.loss_date > 30 THEN 'greater than 30 days'
            END  Lag_Time                                
          FROM claim_table CLM   
          INNER JOIN policy_table IRP ON IRP.KEY = CLM.KEY                                
             WHERE IRP.POLICY_NUMBER in  ('12345678'))              
             group by lag_time
             order by lag_time

2 个答案:

答案 0 :(得分:0)

使用LEFT OUTER JOINPIVOT将存储桶聚合到列:

SELECT *
FROM   (
  SELECT POLICY_NUMBER,
         CASE
           WHEN CLM.reported_date IS NULL OR CLM.loss_date IS NULL THEN 'No claim'
           WHEN CLM.reported_date - CLM.loss_date <=  5            THEN 'Within 5 days'
           WHEN CLM.reported_date - CLM.loss_date <= 10            THEN '6-10 days'
           WHEN CLM.reported_date - CLM.loss_date <= 15            THEN '11-15 days'
           WHEN CLM.reported_date - CLM.loss_date <= 20            THEN '16-20 days'
           WHEN CLM.reported_date - CLM.loss_date <= 25            THEN '21-25 days'
           WHEN CLM.reported_date - CLM.loss_date <= 30            THEN '26-30 days'
                                                                   ELSE '31 or more days'
         END  Lag_Time                                
  FROM   policy_table IRP
         LEFT OUTER JOIN claim_table CLM   
         ON IRP.KEY = CLM.KEY                                
  WHERE  IRP.POLICY_NUMBER in  ('12345678')
) t
PIVOT(
  COUNT( 1 )
  FOR lag_time IN (
    'No claim'        AS "no_claims",
    'Within 5 days'   AS "within_5_days",
    '6-10 days'       AS  "6_to_10_days",
    '11-15 days'      AS "11_to_15_days",
    '16-20 days'      AS "16_to_20_days",
    '21-25 days'      AS "21_to_25_days",
    '26-30 days'      AS "26_to_30_days",
    '31 or more days' AS "31_or_more_days"
  )
);

答案 1 :(得分:0)

您可以使用PIVOT命令:

create table xxjk as
  select 'Within 5 Days' bucket, 5 n from dual union all
  select '6 - 10 Days' bucket, 7 n from dual;

select *
  from xxjk
 pivot (sum(n) for bucket in ('Within 5 Days' within_5_days,'6 - 10 Days' six_to_ten_days));

当然,推断出你自己的数据。