【问题标题】:Pivot without aggregate function没有聚合函数的枢轴
【发布时间】:2020-06-24 01:52:19
【问题描述】:

我正在尝试将行的某些部分转换为列。据我所知,我只能使用带有聚合函数的枢轴,但我只会旋转文本。对于每个客户端,我最多有 4 行按 DLSEQUENCE 字段分组。我希望所有内容都在 1 行上,而不是 4 行。

SELECT CASE
        WHEN Sched_time BETWEEN TRUNC(SCHED_TIME) + INTERVAL  '8' HOUR + INTERVAL '30' MINUTE
                         AND TRUNC(SCHED_TIME) + INTERVAL '14' HOUR + INTERVAL '45' MINUTE AND
          TO_CHAR(SCHED_TIME, 'DY') IN ('MON', 'TUE', 'WED', 'THU', 'FRI')
        THEN 'ABC' 
        ELSE 'DEF'
   END AS Organization,
   Client_Last_Name,
   Client_First_Name,
   Sched_Time,  
   Field_Name,
   CASE 
        WHEN Recoded_Response = '1' THEN 'Yes'
        WHEN Recoded_Response = '2' THEN 'No'
        ELSE Recoded_Response
    END AS Responses,
   Dlsequence
FROM DAILY_LOG_CUSTOM_DATA 
WHERE SERVICE_NAME = 'Medical'
AND FIELD_CATEGORY = 'Background Information'
AND Field_Name IN
(
'Restraint?',
'History',
'Findings',
'Treatment'
)
AND Sched_Time >= TO_DATE('2020-03-01 01:00:00', 'YYYY/MM/DD HH:MI:SS') 
AND Sched_Time  < TO_DATE('2020-03-31 12:59:00', 'YYYY/MM/DD HH:MI:SS')
Order BY Dlsequence

这是我的桌子:

我希望与 ('Restraint?','History','Findings','Treatment') 一起使用的响应字段为每个 DLSEQUENCE 字段都有自己的列。

【问题讨论】:

  • 透视或条件聚合需要聚合函数。您可以将 max() 或 min() 用于文本。如果您有两行相同的 dlsequence 和 History 怎么办?例如,您可以使用 listagg()。或者您可以首先使用 row_number() 将它们显示在两个单独的行中。一切都取决于这种情况是否可能以及在这种情况下您想要什么。
  • 请不要发布代码或数据的图像 - 而是将它们都以格式化文本的形式发布。这允许人们复制文本并根据需要对其进行操作,以帮助复制您的问题并找到问题的答案。另外,请附上您期望的结果示例,使用您的测试数据得出结果,以便人们可以看到您想要获得的结果。谢谢。
  • @BobJarvis-ReinstateMonica - 我正在努力为您提供格式化文本。

标签: sql oracle


【解决方案1】:

以下内容应该符合您的想法:

SELECT DLSEQUENCE,
       ORGANIZATION,
       CLIENT_LAST_NAME,
       CLIENT_FIRST_NAME,
       SCHED_TIME,
       LISTAGG("Restraint?", ',') WITHIN GROUP (ORDER BY DLSEQUENCE) AS "Restraint?",
       LISTAGG("Findings", ',') WITHIN GROUP (ORDER BY DLSEQUENCE) AS "Findings",
       LISTAGG("History", ',') WITHIN GROUP (ORDER BY DLSEQUENCE) AS "History",
       LISTAGG("Treatment", ',') WITHIN GROUP (ORDER BY DLSEQUENCE) AS "Treatment"
  FROM (SELECT DLSEQUENCE,
               ORGANIZATION,
               CLIENT_LAST_NAME,
               CLIENT_FIRST_NAME,
               SCHED_TIME,
               CASE
                 WHEN FIELD_NAME = 'Restraint?' THEN RESPONSES
                 ELSE NULL
               END AS "Restraint?",
               CASE
                 WHEN FIELD_NAME = 'Findings' THEN RESPONSES
                 ELSE NULL
               END AS "Findings",
               CASE
                 WHEN FIELD_NAME = 'History' THEN RESPONSES
                 ELSE NULL
               END AS "History",
               CASE
                 WHEN FIELD_NAME = 'Treatment' THEN RESPONSES
                 ELSE NULL
               END AS "Treatment"
          FROM YOUR_TABLE)
  GROUP BY DLSEQUENCE,
           ORGANIZATION,
           CLIENT_LAST_NAME,
           CLIENT_FIRST_NAME,
           SCHED_TIME

db<>fiddle here

【讨论】:

  • 就是这样!将来我将不得不处理listagg() 函数。谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-05-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多