【问题标题】:selecting the name of the column as values from different column选择列的名称作为来自不同列的值
【发布时间】:2012-09-30 13:43:25
【问题描述】:

我有一个包含以下列的表格

  • End_date
  • count_all_transactions.
  • count_timeouts
  • request_key

现在我需要为两个不同的日期计算percentagetimeout 并同时显示它们。我已经建立了我的查询。

我的查询如下:

Select PercentageTimeout ,
  PerTimeout,
  Transaction
From 
(
  select 
    T.COUNT_ALL_TRANSACTIONS as Total,
    T.END_DATE as DT1,
    T.COUNT_TIMEOUTS as Timeouts,
    round (((T.COUNT_TIMEOUTS / T.COUNT_ALL_TRANSACTIONS) * 100)
             ,2) as PercentageTimeout,
    R.INTERFACE_NAME as Transaction
  from rpt_timeout T, dim_request R
  where
    T.REQUEST_KEY = R.REQUEST_KEY
  AND
    T.END_DATE='27 AUG 2012'
) 
left outer join 
(
  select T1.COUNT_ALL_TRANSACTIONS as Total1,
    T1.END_DATE as DT2,
    T1.COUNT_TIMEOUTS as Timeouts1,
    round (((T1.COUNT_TIMEOUTS / T1.COUNT_ALL_TRANSACTIONS) * 100)
             ,2) as PerTimeout,
    R1.INTERFACE_NAME as Transaction1
  from rpt_timeout T1, dim_request R1
  where T1.REQUEST_KEY = R1.REQUEST_KEY
  AND T1.END_DATE='20 AUG 2012'
) on Transaction = Transaction1;

这个查询给了我正确的结果,但我正在努力解决的是我需要列的名称作为该表中相应的 END_DATE,即: 我的输出应该是这样的

27-AUG-2012   20-AUG-2012  Transaction
0.28          0.1          Qpay 
0.09          0.06         Payment

【问题讨论】:

  • 您能否发布您的查询当前产生的输出,以便我们获得“对数据的感觉”?
  • 我目前的输出是:PercentageTimeout PerTimeout Transaction 0.28 0.1 Qpay 0.09 0.06 Payment 我需要的是 END_DATE 列的值显示为我的列名,而不是 PercentageTimeout 和 PerTimeout。我不知道如何实现这一目标
  • 我发布的查询我没有选择 end_date 但 end_date 的值是 27-AUG-2012 和 20-AUG-2012
  • @user1733739 如果您需要 Oracle 的动态数据透视解决方案 - 那么您可以查看 to this link
  • @user1733739,你如何决定使用哪两个日期?这些是常量、参数还是什么?

标签: sql oracle11g pivot


【解决方案1】:

您需要为此使用动态 SQL。由于这是特定于 Oracle 的,这意味着使用 PL/SQL 构造查询,然后使用 EXECUTE IMMEDIATE 语句执行它。

请看下面的链接...

http://docs.oracle.com/cd/B10500_01/appdev.920/a96590/adg09dyn.htm

这是一些示例代码;它不完整,甚至可能在语法上不正确(我手边没有 Oracle 服务器,并且有一段时间没有与 Oracle 合作过),只是一个片段,让您了解我在说什么。

DECLARE
  query VARCHAR2(4000);
  date1 VARCHAR2(25);
  date2 VARCHAR2(25);
BEGIN
  date1 := '27-AUG-2012';
  date2 := '20-AUG-2012';
  query := 'Select PercentageTimeout as ' || date1 ||
           ', PerTimeout as ' || date2 ||
           ',   Transaction From  <the rest of your query goes here>';

  EXECUTE IMMEDIATE query;
END;

现在您可能想要创建一个游标,而不是从您的动态构造的查询字符串中迭代并遍历记录;无论你需要做什么。要点是,如果要在查询中动态指定列别名,则需要动态构造该查询。

【讨论】:

    猜你喜欢
    • 2021-02-16
    • 2022-06-10
    • 2010-11-18
    • 1970-01-01
    • 2021-12-27
    • 1970-01-01
    • 2023-01-31
    • 1970-01-01
    • 2016-09-10
    相关资源
    最近更新 更多