Почему заказ не работает в моем запросе с Pivot-предложением? - PullRequest
1 голос
/ 16 марта 2020
Data

Client     Cluster     Vol
----------------------------
A1         AS          23 
A2         AEA         24
A3         HT          48
A4         PT          25
A4         AES         25
Query

SELECT * FROM
(SELECT client, cluster_log, sum(CS_VOL)
FROM FID            
GROUP BY client, cluster_log
PIVOT
(
sum(CS_VOL)
FOR CLUSTER_LOG IN ('AS','AEA','HT','PT','AES') 
)
ORDER BY SUM(CS_VOL);

Привет всем,

В порядке выполнения выдается ошибка для этого запроса. Можете ли вы помочь? Я понимаю, что сводная таблица не показывает CS_VOL, но разбивает CS_VOL на cluster_log (что она и должна делать), но я бы хотела упорядочить сводную переменную (cluster_log) по CS_VOL, но я получаю сообщение об ошибке «Неизвестный идентификатор» для CS_VOL в order by.

Другой вариант - добавить CS_VOL в дополнение к Cluster_log и упорядочить его, но я не уверен, как привести это в сводку.

Большое спасибо

Ответы [ 4 ]

2 голосов
/ 16 марта 2020

Упорядочение по SUM(CS_VOL) не имеет смысла, поскольку вы конвертируете значения в строках в несколько столбцов, и неясно, как будет применяться такой порядок.

Вы можете просто сделать:

SELECT *
FROM   FID            
PIVOT  (
  SUM(CS_VOL) FOR CLUSTER_LOG IN ('AS','AEA','HT','PT','AES')
);

Что для ваших тестовых данных:

CREATE TABLE fid ( Client, Cluster_Log, CS_Vol ) AS
SELECT 'A1', 'AS',  23 FROM DUAL UNION ALL
SELECT 'A2', 'AEA', 24 FROM DUAL UNION ALL
SELECT 'A3', 'HT',  48 FROM DUAL UNION ALL
SELECT 'A4', 'PT',  25 FROM DUAL UNION ALL
SELECT 'A4', 'AES', 25 FROM DUAL;

Выходы:

CLIENT | 'AS' | 'AEA' | 'HT' | 'PT' | 'AES'
:----- | ---: | ----: | ---: | ---: | ----:
A2     | <em>null</em> |    24 | <em>null</em> | <em>null</em> |  <em>null</em>
A3     | <em>null</em> |  <em>null</em> |   48 | <em>null</em> |  <em>null</em>
A1     |   23 |  <em>null</em> | <em>null</em> | <em>null</em> |  <em>null</em>
A4     | <em>null</em> |  <em>null</em> | <em>null</em> |   25 |    25

Вам не нужно выражение ORDER BY в SUM, так как эти значения будут в столбцах, а не в строках (так как они были предметом PIVOT). Если вам нужно предложение ORDER BY, вы можете ORDER BY client (или один из только что созданных столбцов).

Если вы хотите ORDER BY, то по всем столбцам просто добавьте значения:

SELECT *
FROM   FID            
PIVOT  (
  SUM(CS_VOL) FOR CLUSTER_LOG IN (
    'AS'  AS "AS",
    'AEA' AS AEA,
    'HT'  AS HT,
    'PT'  AS PT,
    'AES' AS AES
  )
)
ORDER BY COALESCE("AS",0)+COALESCE(AEA,0)+COALESCE(HT,0)+COALESCE(PT,0)+COALESCE(AES,0);

Какие выходы:

CLIENT |   AS |  AEA |   HT |   PT |  AES
:----- | ---: | ---: | ---: | ---: | ---:
A1     |   23 | <em>null</em> | <em>null</em> | <em>null</em> | <em>null</em>
A2     | <em>null</em> |   24 | <em>null</em> | <em>null</em> | <em>null</em>
A3     | <em>null</em> | <em>null</em> |   48 | <em>null</em> | <em>null</em>
A4     | <em>null</em> | <em>null</em> | <em>null</em> |   25 |   25

db <> Fiddle здесь

2 голосов
/ 16 марта 2020

Будет ли это то, что вы ищете:

SELECT * 
FROM (SELECT client
             , cluster_log
             , CS_VOL
             , sum(CS_VOL) test
      FROM FID
      group by client
               , cluster_log
               , CS_VOL)
PIVOT 
(
  sum(CS_VOL)
  FOR cluster_log
  IN ('AS','AEA','HT','PT','AES')
)
order by test desc

Или, может быть, это:

SELECT * 
FROM (SELECT client
             , cluster_log
             , sum(CS_VOL) CS_VOL
             , sum(CS_VOL) test
      FROM FID
      group by client
               , cluster_log)
PIVOT 
(
  sum(CS_VOL)
  FOR cluster_log
  IN ('AS','AEA','HT','PT','AES')
)
order by test desc

Вот демо

2 голосов
/ 16 марта 2020

Просто используйте условное агрегирование:

SELECT client,
       SUM(CASE WHEN CLUSTER_LOG = 'AS' THEN CS_VOL END) as vol_as,
       SUM(CASE WHEN CLUSTER_LOG = 'AEA' THEN CS_VOL END) as vol_aea,
       SUM(CASE WHEN CLUSTER_LOG = 'HT' THEN CS_VOL END) as vol_ht,
       SUM(CASE WHEN CLUSTER_LOG = 'PT' THEN CS_VOL END) as vol_pt,
       SUM(CASE WHEN CLUSTER_LOG = 'AES' THEN CS_VOL END) as vol_aes
FROM FID            
GROUP BY client
ORDER BY SUM(CS_VOL);
1 голос
/ 16 марта 2020

Попробуйте это:

with fid as
(
select 'A1' client, 'AS' Cluster_log, 23 cs_vol from dual union
select 'A2', 'AEA', 24 from dual union
select 'A3', 'HT',  48 from dual union
select 'A4', 'PT',  25 from dual union
select 'A4', 'AES', 25 from dual
)
, pivot_query as
(
SELECT *
FROM FID            
PIVOT
(
sum(CS_VOL)
FOR CLUSTER_LOG IN ('AS','AEA','HT','PT','AES') 
)
)
select pivot_query.* 
, (select sum(cs_vol) from fid where fid.client = pivot_query.client) sum_cs_vol
from pivot_query
order by sum_cs_vol
;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...