选择列的名称作为来自不同列的值

时间:2012-10-10 06:36:52

标签: sql oracle11g pivot

我有一个包含以下列的表

  • 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

1 个答案:

答案 0 :(得分:0)

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

请参阅以下链接...

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

这是一些示例代码;它不完整,甚至可能在语法上不正确(我没有Oracle服务器,并且在一段时间内没有与Oracle合作),只是一个片段,让你知道我在说什么。 / p>

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;

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