关于在Sap Hana上进行透视的问题

2020-09-12 07:36发布

点击此处---> 群内免费提供SAP练习系统(在群公告中)加入QQ群:457200227(SAP S4 HANA技术交流) 群内免费提供SAP练习系统(在群公告中)你好 我试图创建一个过程,该过...

         点击此处--->   EasySAP.com群内免费提供SAP练习系统(在群公告中)

加入QQ群:457200227(SAP S4 HANA技术交流) 群内免费提供SAP练习系统(在群公告中)


你好

我试图创建一个过程,该过程将接收一个表,然后根据它将接收的值将行转置为列。 我设法实现了这一点,但是由于大量的值(=列),执行该过程几乎需要10分钟。

除了使用解析视图(不能随列名或要传输的值的数目/名称动态变化)外,任何人都可以提出一种更快的方法来实现它。 真可悲的是,几年前,其他数据库已经实现了这一简单的练习。

谢谢。

付费偷看设置
发送
3条回答
代楠1984
1楼-- · 2020-09-12 07:56

迪米特里奥斯,

您是否尝试过SAP HANA Flowgraphs中的Pivot功能? 当我知道我想将哪些列作为枢轴列并且可以正常工作时,可以将其用于静态转换。 但是,我不确定是否可以动态选择枢轴列,但也许值得尝试。

最好

Felix

大简至美
2楼-- · 2020-09-12 07:54

您还尝试过表函数吗? 使用SQLScript

Bunny_CDM
3楼-- · 2020-09-12 08:05

您好,

谢谢你们的回答,我设法创建了一个可以运行几秒钟的proc,

创建过程PIVOT_TABLE(IN SCHEMA_NAME VARCHAR(100),IN TABLE_NAME VARCHAR(100))
 语言SQLSCRIPT
 如
 开始
 --------------------------------------------------  -------------------------------------------
 -在同一模式下从插入的PIVOT_#TABLE_NAME_INSERTED中创建PIVOT表-
 -仅适用于一公制
 --------------------------------------------------  --------------------------------------------
 DECLARE v_count INT默认值1;
 宣告STEP0 VARCHAR(100000)默认'';
 声明STEP1 VARCHAR(100000)默认值'';
 声明STEP4 VARCHAR(100);
 声明STEP5 VARCHAR(1000)默认值'';
 声明STEP6 VARCHAR(1000000)默认值'';
 声明STEP7 VARCHAR(1000);
 十进制rn_ INTEGER;

 声明IN_SCHEMA_NAME VARCHAR(100):=:SCHEMA_NAME;
 声明IN_TABLE_NAME VARCHAR(100):=:TABLE_NAME;
 exec'设置架构'||:IN_SCHEMA_NAME;

 创建表" VARIABLE _"(RN2 INTEGER,VARIABLE INTEGER);
 删除表" VARIABLE_";
 创建表" rn _"(rn_ INTEGER);

    从"" ||:IN_TABLE_NAME ||'";中选择'INSERT INTO" rn_" SELECT COUNT(DISTINCT"'||列名||'"))
    进入step4
  来自TABLE_COLUMNS
  其中TABLE_NAME =:IN_TABLE_NAME
   AND SCHEMA_NAME =:IN_SCHEMA_NAME
  和位置= 2;

   执行:STEP4;
  
   选择rn_
   INTO rn_
   来自" rn_";
  
  选择
 '创建列表变量_ AS(选择row_number()over(按'||
 (从TABLE_COLUMNS中选择'"'||| column_name ||'"''
 SCHEMA_NAME =:IN_SCHEMA_NAME AND TABLE_NAME =:IN_TABLE_NAME并且位置= 2)||')AS" RN2",
   "'||(从TABLE_COLUMNS中选择column_name
 SCHEMA_NAME =:IN_SCHEMA_NAME AND TABLE_NAME =:IN_TABLE_NAME并且位置= 2)||'"作为"变量",来自(
   SELECT DISTINCT"'||(从TABLE_COLUMNS中选择column_name
 SCHEMA_NAME =:IN_SCHEMA_NAME AND TABLE_NAME =:IN_TABLE_NAME并且位置= 2)||'""
 FROM"'||:IN_SCHEMA_NAME ||'"。" || :: IN_TABLE_NAME ||'")));'
 进入STEP5
 来自DUMMY;

 EXEC:STEP5;

  当rn_> =:V_COUNT DO
 选择
 ',MAX(当RN2 ='||:v_count ||'THEN"'||(SELECT COLUMN_NAME FROM(
 选择POSITION,column_name,MAX(position)OVER()AS XX
 来自table_COLUMNS
 其中TABLE_NAME =:IN_TABLE_NAME和SCHEMA_NAME =:IN_SCHEMA_NAME
 )WHERE XX = POSITION)||''" END)AS"'||
 (从" VARIABLE_"中选择VARIABLE,其中rn2 =:v_count)
 ||'"
 '
 进入STEP0
 从假人

 STEP1:= STEP1 |||:STEP0;

 v_count:= v_count +1;
 结束

 SELECT'CREATE COLUMN TABLE TARGET_ AS(SELECT"'||(
 从table_COLUMNS中选择" COLUMN_NAME"
 其中TABLE_NAME =:IN_TABLE_NAME AND SCHEMA_NAME =:IN_SCHEMA_NAME AND POSITION = 1
 )||'"'||:STEP1
 ||'FROM(
 SELECT A。*,ROW_NUMBER()OVER(PARTITION BY"'||
 (从table_COLUMNS中选择" COLUMN_NAME"
 其中TABLE_NAME =:IN_TABLE_NAME AND SCHEMA_NAME =:IN_SCHEMA_NAME AND POSITION = 1)||'"" ORDER BY"'||
 (从table_COLUMNS中选择" COLUMN_NAME"
 其中TABLE_NAME =:IN_TABLE_NAME AND POSITION = 2)
 ||''))AS" RN2",来自"'||:IN_SCHEMA_NAME ||'"。"'||:IN_TABLE_NAME ||'" A
 )
 GROUP BY"'||
 (
 从table_COLUMNS中选择" COLUMN_NAME"
 其中TABLE_NAME =:IN_TABLE_NAME AND SCHEMA_NAME =:IN_SCHEMA_NAME AND POSITION = 1
 )||'");'
 进入STEP6
  来自DUMMY;
 
  执行:STEP6;
 
 
 exec'设置架构'||:IN_SCHEMA_NAME;
 删除表" VARIABLE_";
 DROP表" rn_";
 结束; 

再次感谢您的宝贵时间。

一周热门 更多>