简体   繁体   English

从行值获取百分比

[英]Get percentage from row values

I am using PHP with ORACLE. 我在ORACLE中使用PHP。

SELECT AIP.TERMID, (select count(RAU.TERMNAME) FROM REPORT_API_USAGE RAU WHERE RAU.TERMID = AIP.TERMID AND RAU.VOCID = 21) as page_views , COUNT(case when aip.ctype = 'download' then 1 else null end) as page_download , COUNT(case when aip.ctype = 'event' then 1 else null end) as page_event FROM REPORT_API_PAGES AIP GROUP BY AIP.TERMID

This is my query to get details. 这是我的查询以获取详细信息。 I need to find the percentage of page_views , page_download , & page_event 我需要找到page_viewspage_downloadpage_event

SQL Fiddle SQL小提琴

Oracle 11g R2 Schema Setup : Oracle 11g R2架构设置

CREATE TABLE REPORT_API_USAGE
    ("VOCID" int, "TERMNAME" varchar2(9))
;

INSERT ALL 
    INTO REPORT_API_USAGE ("VOCID", "TERMNAME")
         VALUES (21, 'blah')
    INTO REPORT_API_USAGE ("VOCID", "TERMNAME")
         VALUES (21, 'blah')
    INTO REPORT_API_USAGE ("VOCID", "TERMNAME")
         VALUES (21, 'blah')
    INTO REPORT_API_USAGE ("VOCID", "TERMNAME")
         VALUES (21, 'blah')
    INTO REPORT_API_USAGE ("VOCID", "TERMNAME")
         VALUES (21, 'blah')
    INTO REPORT_API_USAGE ("VOCID", "TERMNAME")
         VALUES (21, 'blah blah')
    INTO REPORT_API_USAGE ("VOCID", "TERMNAME")
         VALUES (21, 'blah blah')
    INTO REPORT_API_USAGE ("VOCID", "TERMNAME")
         VALUES (21, 'blah blah')
    INTO REPORT_API_USAGE ("VOCID", "TERMNAME")
         VALUES (21, 'blah blah')
    INTO REPORT_API_USAGE ("VOCID", "TERMNAME")
         VALUES (21, 'blah blah')
    INTO REPORT_API_USAGE ("VOCID", "TERMNAME")
         VALUES (21, 'blah blah')
    INTO REPORT_API_USAGE ("VOCID", "TERMNAME")
         VALUES (21, 'blah blah')
    INTO REPORT_API_USAGE ("VOCID", "TERMNAME")
         VALUES (21, 'blah blah')
SELECT * FROM dual
;

Query 1 : 查询1

SELECT
      TERMNAME
    , COUNT(TERMNAME) as count_of
    , (COUNT(TERMNAME) * 100.0) / MAX(TOTCOUNT) as pct
FROM (
    SELECT
          AP.TERMNAME
        , COUNT(AP.TERMNAME) OVER() as TOTCOUNT
    FROM REPORT_API_USAGE AP
    WHERE AP.VOCID = '21'
  ) 
GROUP BY TERMNAME  

Results : 结果

|  TERMNAME | COUNT_OF |               PCT |
|-----------|----------|-------------------|
|      blah |        5 | 38.46153846153846 |
| blah blah |        8 | 61.53846153846154 |

longer string version: 较长的字符串版本:

SELECT TERMNAME , COUNT(TERMNAME) as count_of , (COUNT(TERMNAME) * 100.0) / MAX(TOTCOUNT) as pct FROM ( SELECT AP.TERMNAME , COUNT(AP.TERMNAME) OVER() as TOTCOUNT FROM REPORT_API_USAGE AP WHERE AP.VOCID = '21' ) GROUP BY TERMNAME

Generating sample data to work with is something the asker should provide because we have to largely guess what goes in the tables. 询问者应该提供生成要使用的样本数据的原因,因为我们必须在很大程度上猜测表中的内容。 With many reservations I created a sample and trialed the following approach. 由于很多保留,我创建了一个样本并尝试了以下方法。

Note I am offering the SQL portion only, manipulating this into suitable PHP you must do. 注意:我仅提供SQL部分,将其处理为您必须执行的适当PHP。

SQL Fiddle SQL小提琴

Oracle 11g R2 Schema Setup : Oracle 11g R2架构设置

CREATE TABLE REPORT_API_USAGE
    (TERMID int, VOCID int, TERMNAME varchar2(1))
;

INSERT ALL 
    INTO REPORT_API_USAGE ("TERMID", "VOCID", "TERMNAME")
         VALUES (1, 21, 'x')
    INTO REPORT_API_USAGE ("TERMID", "VOCID", "TERMNAME")
         VALUES (1, 21, 'x')
    INTO REPORT_API_USAGE ("TERMID", "VOCID", "TERMNAME")
         VALUES (1, 21, 'x')
    INTO REPORT_API_USAGE ("TERMID", "VOCID", "TERMNAME")
         VALUES (1, 21, 'x')
    INTO REPORT_API_USAGE ("TERMID", "VOCID", "TERMNAME")
         VALUES (1, 21, 'x')
    INTO REPORT_API_USAGE ("TERMID", "VOCID", "TERMNAME")
         VALUES (1, 21, 'x')
    INTO REPORT_API_USAGE ("TERMID", "VOCID", "TERMNAME")
         VALUES (1, 21, 'x')
    INTO REPORT_API_USAGE ("TERMID", "VOCID", "TERMNAME")
         VALUES (1, 21, 'x')
    INTO REPORT_API_USAGE ("TERMID", "VOCID", "TERMNAME")
         VALUES (1, 21, 'x')
SELECT * FROM dual
;

CREATE TABLE REPORT_API_PAGES
    (TERMID int, CTYPE varchar2(8))
;

INSERT ALL 
    INTO REPORT_API_PAGES ("TERMID", "CTYPE")
         VALUES (1, 'download')
    INTO REPORT_API_PAGES ("TERMID", "CTYPE")
         VALUES (1, 'event')
    INTO REPORT_API_PAGES ("TERMID", "CTYPE")
         VALUES (1, 'download')
    INTO REPORT_API_PAGES ("TERMID", "CTYPE")
         VALUES (1, 'event')
    INTO REPORT_API_PAGES ("TERMID", "CTYPE")
         VALUES (1, 'download')
    INTO REPORT_API_PAGES ("TERMID", "CTYPE")
         VALUES (1, 'event')
    INTO REPORT_API_PAGES ("TERMID", "CTYPE")
         VALUES (1, 'download')
    INTO REPORT_API_PAGES ("TERMID", "CTYPE")
         VALUES (1, 'event')
SELECT * FROM dual
;

Query 1 : 查询1

SELECT
      AIP.TERMID
    , RAU.page_views
    , COUNT(CASE
            WHEN aip.ctype = 'download' THEN 1
            ELSE NULL
      END) AS page_download
    , COUNT(CASE
            WHEN aip.ctype = 'event' THEN 1
            ELSE NULL
      END) AS page_event
    , (COUNT(CASE
            WHEN aip.ctype = 'download' THEN 1
            ELSE NULL
      END) * 100.0) / RAU.page_views as dnload_pt
    , (COUNT(CASE
            WHEN aip.ctype = 'event' THEN 1
            ELSE NULL
      END) * 100.0) / RAU.page_views as event_pct

FROM REPORT_API_PAGES AIP
LEFT JOIN (
      SELECT
            TERMID
          , COUNT(*) AS page_views
      FROM REPORT_API_USAGE
      WHERE VOCID = 21
      GROUP BY TERMID
          ) RAU ON RAU.TERMID = AIP.TERMID
GROUP BY
      AIP.TERMID
    , RAU.page_views

Results : 结果

| TERMID | PAGE_VIEWS | PAGE_DOWNLOAD | PAGE_EVENT |         DNLOAD_PT |         EVENT_PCT |
|--------|------------|---------------|------------|-------------------|-------------------|
|      1 |          9 |             4 |          4 | 44.44444444444444 | 44.44444444444444 |

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM