简体   繁体   English

SAP HANA:无法使用 COUNT 和 CASE function IN SQL 生成所需的 output

[英]SAP HANA: Not able to generate the required output with COUNT and CASE function IN SQL

This is a scenario with single user assigned to multiple branches (1 to many)这是一个场景,单个用户分配给多个分支(1 到许多)

I want to group users on the basis of office assigned to that user.我想根据分配给该用户的办公室对用户进行分组。 Based on the office assigned I want to create 2 columns in the select statement:根据分配的办公室,我想在 select 语句中创建 2 列:

  1. The count of offices assigned to this user分配给该用户的办公室数量

  2. The name of the offices assigned to this user分配给该用户的办公室名称

This is the output I get with SQL (see below):这是我用 SQL 得到的 output(见下文):

USER_LABEL          NUMBER_OFFICE_ASSIGNED   BRANCH_ASSIGNED      
-------------------------------------------------------------
FARAG                       1                  HQ
FARAG                       1                  SCM
FARAG                       1                  TCD
FARAG                       1                  TCM

This is the output that I require:这是我需要的 output:

USER_LABEL          NUMBER_OFFICE_ASSIGNED   BRANCH_ASSIGNED      
-------------------------------------------------------------
FARAG                       4                  HQ,SCM,TCD,TCM

How to do it?怎么做?

The SQL code is as follows: SQL代码如下:

SELECT us.USER_LABEL ,
count(od.office_id) AS "NUMBER_OFFICE_ASSIGNED",
CASE 
   WHEN od.OFFICE_ID=4 THEN 'HQ' 
   WHEN od.OFFICE_ID=5 THEN 'TCM'
   WHEN od.OFFICE_ID=6 THEN 'TCD'
   WHEN od.OFFICE_ID=7 THEN 'SCM'
   WHEN od.OFFICE_ID=8 THEN 'SSAAC' 
ELSE 'No branch assigned. Check with Admin'
END AS "BRANCH_ASSIGNED"    
FROM VIEW_USER_SETUP us
INNER JOIN USERS_DEPARTMENTS ud 
on(us.USER_ID=ud.USER_ID)
INNER JOIN DEPARTMENT_SETUP ds
on(ud.DEPARTMENT_ID=ds.DEPARTMENT_ID)
INNER JOIN DEPARTMENT_OFFICE do 
on(ds.DEPARTMENT_ID=do.DEPARTMENT_ID)
INNER JOIN OFFICE_DETAILS od 
on(do.OFFICE_ID=od.OFFICE_ID)
WHERE
   ds.ACTIVE_STATUS ='Y'
AND 
   do.ACTIVE_STATUS='Y'
AND 
   od.ACTIVE_STATUS='Y'
AND 
   us.ACTIVE_STATUS ='Y'
AND 
   us.USER_TYPE ='D'
AND 
   us.USER_LABEL NOT IN('Emergency Room','General Doctor','General Doctor Oph')
GROUP BY 
    us.USER_LABEL, 
    od.OFFICE_ID
ORDER BY 
    us.USER_LABEL ASC;

First, you should remove od.OFFICE_ID from the GROUP BY clause since ultimately, you do not want to group by OFFICE_ID .首先,您应该从GROUP BY子句中删除od.OFFICE_ID ,因为最终您不想按OFFICE_ID进行分组。 This change requires you to apply an aggregation to your CASE projection since it uses OFFICE_ID .此更改要求您对CASE投影应用聚合,因为它使用OFFICE_ID The correct aggregation method based on your desired output is function STRING_AGG .基于您所需的 output 的正确聚合方法是 function STRING_AGG

The resulting statement looks something like结果语句看起来像

SELECT 
   us.USER_LABEL ,
   count(od.office_id) AS "NUMBER_OFFICE_ASSIGNED",
   STRING_AGG(CASE .... END, ',') AS "BRANCH_ASSIGNED"    
FROM ...
WHERE ...
GROUP BY 
    us.USER_LABEL
ORDER BY 
    us.USER_LABEL ASC;

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM