Excel Pivot:在表中旋转两列而不汇总值

时间:2017-07-25 10:31:53

标签: sql excel oracle pivot

我在excel中使用此查询来获取下表:

SELECT 
"WORK_CENTER"."EQNO",
"UD_DATA"."UD_COLS_ID",
"WORK_CENTER"."CUSER1",
"WORK_CENTER"."CUSER2",
"WORK_CENTER"."CUSER3",
"WORK_CENTER"."CUSER4", 
"WORK_CENTER"."CUSER5",
"WORK_CENTER"."NUSER1",
"WORK_CENTER"."NUSER2",
"WORK_CENTER"."NUSER3",
"WORK_CENTER"."NUSER4",
"WORK_CENTER"."NUSER5",
"UD_DATA"."CUSER"
FROM   "IQMS"."UD_DATA" "UD_DATA" 
FULL OUTER JOIN "IQMS"."WORK_CENTER" "WORK_CENTER" 
ON
 "UD_DATA"."PARENT_ID"="WORK_CENTER"."ID"
WHERE  
 "WORK_CENTER"."MFG_TYPE"='INJECTION'  
AND
 "UD_DATA"."UD_COLS_ID" IS NOT NULL
ORDER BY "WORK_CENTER"."EQNO"
  

结果

我得到下表: Table

除了UD_COLS_ID(16,17,16,17 ...)和CUSER(1000,test1,2000,test2 .....)之外还有重复的内容

  

期望的结果

但我在Excel中尝试做的是将列UD_COLS_ID转移到CUSER(上一个图像中的最后一列)列,删除现在重复的行并获取this.

我已尝试使用excels数据透视表来执行此操作,但我似乎无法阻止它汇总值,例如我将列标题的UD_COLS_ID,EQNO和CUSER作为值。但它一直在总结价值领域,似乎不是一种不选择它的方法? Image

为此搜索修复程序会让我回到他们想要汇总数据的示例。并且在行和列中添加更多值会使其更难以遵循。

我该怎么做呢?

1 个答案:

答案 0 :(得分:1)

你正在寻找更像这样的东西:

SELECT 
  WORK_CENTER.EQNO,
  WORK_CENTER.CUSER1,
  WORK_CENTER.CUSER2,
  WORK_CENTER.CUSER3,
  WORK_CENTER.CUSER4, 
  WORK_CENTER.CUSER5,
  WORK_CENTER.NUSER1,
  WORK_CENTER.NUSER2,
  WORK_CENTER.NUSER3,
  WORK_CENTER.NUSER4,
  WORK_CENTER.NUSER5,
  UD_DATA_id_16.CUSER as ID_16,
  UD_DATA_id_17.CUSER as ID_17

FROM   
  IQMS.WORK_CENTER WORK_CENTER 
  INNER JOIN
  IQMS.UD_DATA UD_DATA_id_16  
  ON
    WORK_CENTER.ID=UD_DATA_id_16.PARENT_ID AND
    UD_DATA_id_16.UD_COLS_ID = 16

  INNER JOIN
  IQMS.UD_DATA UD_DATA_id_17  
  ON
    WORK_CENTER.ID=UD_DATA_id_17.PARENT_ID AND
    UD_DATA_id_17.UD_COLS_ID = 17

WHERE  
  WORK_CENTER.MFG_TYPE='INJECTION'
ORDER BY 
  WORK_CENTER.EQNO

为什么呢?好吧,显然UD_DATA每个work_center行有2行,但是你不希望这些行都与每个work_center行相关联,因为这会使work_center行加倍。这被称为笛卡尔积。如果ud_data中Y行的work_center中有X行,则重复次数变为X * Y

你需要做的是转换多行" thing"在ud_data中成单行。您可以通过在oracle中旋转数据来执行此操作,也可以通过多次连接表来执行此操作,并指定将ud_data和work_center之间的关系减少到1:1的内容。

具有简化列布局的work_center行:

id, ud_data_id
wc1, ud1
wc2, ud2
wc3, ud3

ud_data行集:

id, thing, otherthing
ud1, apple, 100
ud1, android, 101
ud2, apple, hello
ud2, android, goodbye
ud3, apple, jan-17
ud3, android, dec-25

每个工作中心行的两个UD行需要成为一行。您可以在加入一次之前执行此操作,方法是将UD数据行旋转到如下所示:

id, applething, androidthing
ud1, 100, 101
ud2, hello, goodbye
ud3, jan-17, dec25

或者你加入两次,每次只选择你感兴趣的东西(关于ID没有语法正确 - 没有数据库会接受这个,但这不是重点):

work_center
join ud_data on id=id   AND ud_data.thing='apple'
join ud_data on id=id   AND ud_data.thing='android'