SQL для получения значений - PullRequest
       6

SQL для получения значений

1 голос
/ 28 февраля 2012

я застрял в проблеме sql.Мне нужно что-то вроде этого

M S C

1 sent 12
1 checked 15
1 rejected 9
2 sent 20
2 checked 18
3 rejected 10

Где М означает Месяц, S - Состояние и С - Количество соответственно.Чего я хочу добиться, так это сгруппировать приведенный выше пример по месяцу

Требуется:

MSC

1 sent     12
  checked  15
  rejected  9
2 sent     20
  checked  18
  rejected 10

РЕДАКТИРОВАТЬ 1

Прямо сейчас выражение sql выглядит следующим образом:

select month, status, sum(hit) as count
from myTable
where dateletter between "date from" and "date to"
group by month,status order by month, status

Редактировать 2

Как бы мне этого добиться

         1  2

Sent     12 20

Checked  15 18

Rejected 9  10

где 1, 2 представляют значения месяца из базы данных.

Ответы [ 3 ]

3 голосов
/ 28 февраля 2012
SELECT month AS M, status AS S, SUM(hit) AS C
FROM myTable
WHERE dateletter BETWEEN "date from" AND "date to"
GROUP BY month, status
ORDER BY month, status

В запросе, который вы не можете сгруппировать дальше, вам придется сделать это в отчете. Запрос в порядке и может служить источником записей для отчета. В таком отчете вы вставляете заголовок группы для каждого месяца.


Однако вы можете сделать сводный запрос

SELECT *
FROM
  ( SELECT month AS M, status AS S, SUM(hit) AS C
    FROM myTable
    WHERE dateletter BETWEEN "date from" AND "date to"
    GROUP BY month, status
  )
  PIVOT (
    SUM(C)
    FOR S IN ('sent', 'checked', 'rejected')
  );

Это вернет статус в столбцах

M sent checked rejected
1  12   15       9
2  20   18      10
1 голос
/ 28 февраля 2012

Использование синтаксиса BREAK ON в SQL * Plus:

> BREAK ON M

>           SELECT 1 m , 'sent' s   , 12 c FROM dual
2 UNION ALL SELECT 1   , 'checked'  , 15   FROM dual
3 UNION ALL SELECT 1   , 'rejected' , 9    FROM dual
4 UNION ALL SELECT 2   , 'sent'     , 20   FROM dual
5 UNION ALL SELECT 2   , 'checked'  , 18   FROM dual
6 UNION ALL SELECT 3   , 'rejected' , 10   FROM dual

         M S                 C
---------- -------- ----------
         1 sent             12
           checked          15
           rejected          9
         2 sent             20
           checked          18
         3 rejected         10

Итак, с вашим примером:

SET LINESIZE 2000 TRIMSPOOL ON TRIM ON
BREAK ON MONTH
SPOOL file.txt

SELECT month, status, SUM(hit) AS count
  FROM myTable
 WHERE dateletter BETWEEN "date from" AND "date to"
 GROUP BY month, status
 ORDER BY month, status;

SPOOL OFF
1 голос
/ 28 февраля 2012

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

Вы можете сделать это, используяаналитическая функция свертки в Oracle:

create table tst2
(
m number,
s varchar2(10),
hit number
);


insert into tst2 values (1,'sent',3);
insert into tst2 values (1,'checked',2);
insert into tst2 values (1,'rejected',4);
insert into tst2 values (2,'sent',6);
insert into tst2 values (2,'checked',1);
insert into tst2 values (2,'rejected',3);
commit;

select m,s,sum(hit) as cnt,
case
  when (grouping(s) = 1 and grouping(m) = 1) then 'All total'
  when (grouping(s) = 1 and grouping(m) = 0) then 'Month total'
  else null
end as "Comment"
from tst2
group by rollup(m,s);

И вы получите


     1 sent                3           
     1 checked             2           
     1 rejected            4           
     1                     9 Month total
     2 sent                6            
     2 checked             1           
     2 rejected            3           
     2                    10 Month total
                          19 All total

См. здесь документы Oracle RE: analyticи функции отчетности .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...