2015-07-06 6 views
2

Я хочу выбрать регион мудрых данных и хочу показать каждый регион в качестве заголовка столбца.Выберите и отобразите данные в виде заголовка столбца

Мои данные:

region state status 
North UP  invalid 
North HAR invalid 
North MAH  valid 
South KER  valid 
South TAM  valid 
South KAR  valid 
South KAR  invalid 

Выход:

Status North south total 
invalid 2  1  3 
valid  1  3  4 
total  3  4  7 

Как это сделать? Эти регионы могут быть обновление позже новая область может быть добавлена ​​позже

Есть ли способ, чтобы все активные области первого затем использовать в запросе activeregions

+0

Я хочу для отображения итогового общего количества, а также количества колумнов – Lijo

ответ

2
select status, 
     count(case when region = 'North' then 1 end) as North, 
     count(case when region = 'South' then 1 end) as South 
from tablename 
group by status 

Альтернативное решение, которое может обрабатывать новый регионы позже добавил:

select region, status, count(*) 
from tablename 
group by region, status 

Другое решение, которое также может обрабатывать новые регионы позже добавил:

select region, 
     count(case when status = 'valid' then 1 end) as valid, 
     count(case when status = 'invalid' then 1 end) as invalid 
from tablename 
group by region 
+0

, как я могу показать, когда я не уверен в регионе. может быть, мои регионы могут увеличиться позже – Lijo

+1

Так что, может быть, вам стоит повернуть его в другую сторону, одну строку/регион и столбцы для недействительных и действительных? – jarlh

+0

альтернативные случаи не дают регионам заголовок colunm – Lijo

0

SQL предназначен для получения записей с ранее известных количество столбцов. Таким образом, вы не можете напрямую получить данные в желаемом формате вывода. Есть два варианта в основном:

1) Выбрать агрегированные данные в строках:

select region, status, count(*) 
from mytable 
group by region, status 
order by region, status; 

Тогда пусть ваше приложение отображает данные в столбцах. (Цикл и выборка данных, постройте столбцы в вашей сетке графического интерфейса в соответствии с данными, т. Е. Добавьте новый столбец в свою сетку каждый раз, когда вы получите новый регион.)

2) Выберите различную область, а затем выберите данные:

select distinct region 
from mytable; 

Теперь, когда вы получили «Север» и «Юг», пусть ваше приложение построить следующий запрос динамически:

select status as "Status" 
    , sum(case when region = 'North' then 1 else 0 end) as "North" 
    , sum(case when region = 'South' then 1 else 0 end) as "South" 
from mytable 
group by status; 
+0

, как построить запрос динамически – Lijo

+0

Это зависит от языка, ваше приложение написано в чем-то вроде:. 'Еогеасп (область в регионы) selectClause + = ", sum (случай, когда region = '" + region + "' then 1 else 0 end) as \" "+ region +" \ ""; ' –

0

МЕТОД 1 Пожалуйста, проверьте SQLFIDDLE

FIRST STEP 

Отдельно узнать количество для активных и неактивных участков

SELECT 'ACTIVE' "STATUS",NVL(REGION,'TOTAL') REGION, 
     COUNT(REGION) REGCOUNT 
    FROM TEMPPIVOTTEST 
    where STATUS like 'ACTIVE' 
    GROUP BY ROLLUP (REGION) 

enter image description here

SELECT 'INACTIVE' "STATUS",NVL(REGION,'TOTAL') REGION, 
     COUNT(REGION) REGCOUNT 
    FROM TEMPPIVOTTEST 
    where STATUS like 'INACTIVE' 
    GROUP BY ROLLUP (REGION) 

enter image description here

В этих запросах мы используем GROUP BY ROLLUP так последней строки мы получим сумму все остальные ряды

SECOND STEP 

РЕГИСТРИРУЙТЕСЬ ОБА это опрашивает И использовать Pivot

 SELECT NVL(STATUS,'GRAND TOTAL') STATUS,SUM(EAST) EAST,SUM(NORTH) NORTH,SUM(SOUTH) SOUTH,SUM(TOTAL) TOTAL from 
     (SELECT 'ACTIVE' "STATUS",NVL(REGION,'TOTAL') REGION, 
     COUNT(REGION) REGCOUNT 
    FROM TEMPPIVOTTEST 
    where STATUS like 'ACTIVE' 
    GROUP BY ROLLUP (REGION) 
    union 
    SELECT 'INACTIVE' "STATUS",NVL(REGION,'TOTAL') REGION, 
     COUNT(REGION) REGCOUNT 
    FROM TEMPPIVOTTEST 
    where STATUS like 'INACTIVE' 
    GROUP BY ROLLUP (REGION) 
)pivot (SUM(REGCOUNT) FOR (REGION) IN ('EAST' EAST,'NORTH' NORTH,'SOUTH' SOUTH,'TOTAL' TOTAL)) 
    GROUP BY ROLLUP (STATUS) 

enter image description here

В стержне мы должны дать регионам, которые присутствуют в таблице

МЕТОД 2SQLFIDDLE

другой путь для выполнения того же выше запроса мы указали statu Трудно шнуровой «Активный» и «неактивный» вместо того, что мы можем использовать следующий запрос

SELECT nvl(STATUS,'GRAND_TOTAL') STATUS,sum(EAST)EAST,sum(NORTH)NORTH,sum(SOUTH)SOUTH,sum(TOTAL) TOTAL from 
    (SELECT STATUS,REGION, 
     COUNT(REGION) REGCOUNT 
    FROM TEMPPIVOTTEST 
    GROUP BY (STATUS,REGION) 
    union 
    SELECT STATUS,'TOTAL'REGION, 
     COUNT(REGION) REGCOUNT 
    FROM TEMPPIVOTTEST 
    GROUP BY (STATUS) 

)pivot (SUM(REGCOUNT) FOR (REGION) IN ('EAST' EAST,'NORTH' NORTH,'SOUTH' SOUTH,'TOTAL' Total)) 
    group by rollup (status) 

оракул 10 г поворота не будет работать таким образом, мы можем использовать в сазе

select nvl(status,'total')status,SUM(NORTH) NORTH,SUM(SOUTH)SOUTH,SUM(EAST)EAST,sum(TOTAL)TOTAL from (select status, 
    sum(case when region = 'NORTH' then 1 else 0 end) as "NORTH", 
    sum(case when region = 'SOUTH' then 1 else 0 end) as "SOUTH", 
    sum(case when region = 'EAST' then 1 else 0 end) as "EAST", 
    sum(case when region in('') then 0 else 1 end) as "TOTAL" 
from TEMPPIVOTTEST 
group by status 
)group by ROLLUP (STATUS) 
Смежные вопросы