Oracle SQL Crosstab с суммой - PullRequest
       24

Oracle SQL Crosstab с суммой

0 голосов
/ 12 декабря 2018

Я довольно плохо знаком с Oracle SQL, и мне было поручено создать перекрестный отчет с использованием SQL.У меня есть одна исходная таблица с простой структурой, похожей на эту:

TABLE STRUCTURE

Я пытаюсь создать перекрестную таблицу результатов, чтобы показать общее количество сотрудников на штатследующим образом:

DESIRED RESULTS

В идеале я хотел бы динамически обслуживать офисы, открывающиеся в новых штатах.

Я искалв PIVOTS, но, кажется, не могу понять мою голову.Любое руководство будет с благодарностью получено.

Спасибо.

Ответы [ 2 ]

0 голосов
/ 12 декабря 2018

В PIVOT вы можете начать с исходного подзапроса.
Затем вы определяете, какое поле объединять, для каких заголовков в другом поле.

SELECT *
FROM
(
  SELECT Company, State, Staff
  FROM YourCompanyStaffTable
  WHERE State IN ('Illinois', 'Texas', 'Tennessee', 'Missouri', 'Kansas', 'Indiana')
) src
PIVOT (
  SUM(Staff)
  FOR State IN (
    'Illinois' as Illinois, 
    'Texas' as Texas, 
    'Tennessee' as Tennessee, 
    'Missouri' as Missouri, 
    'Kansas' as Kansas, 
    'Indiana' as Indiana
  )
) pvt
ORDER BY Company

В этом запросе новые имена столбцов генерируются из столбца «Состояние».
Обратите внимание, что в исходном запросе также есть ограничение для этих имен.
Это только для эффективностипричины.(меньше данных для извлечения из таблицы)

И он сгруппирует результаты по полям источника, которые не используются в объявлении PIVOT.
В этом случае он автоматически группируется по «Компании»колонка.

Таким образом, он суммирует общую сумму «Штат» для каждого «Штата» на «Компанию».

0 голосов
/ 12 декабря 2018

вариант использования, когда

select company, sum(case when state='Illinois' then staff else 0 end) as  Illinois,
 sum(case when state='Texas' then staff else 0 end) as  Texas,
 sum(case when state='Tennessee' then staff else 0 end) as  Tennessee,
 sum(case when state='Missouri' then staff else 0 end) as  Missouri,
 sum(case when state='Kansas' then staff else 0 end) as  kansas,
sum(case when state='Indiana' then staff else 0 end) as  Indiana from t
group by company
...