2016-01-13 56 views
-2

的比较值创建Oracle视图我要创建一个基于表Oracle视图,类似的以下内容:如何基于表

<table border="1"> 
 
    <tr> 
 
    <td>Id</td><td>store-id</td><td>prod-id</td><td>s-date</td> 
 
    </tr> 
 
    <tr> 
 
    <td>1</td><td>21</td><td>2</td><td>NULL</td> 
 
    </tr> 
 
    <tr> 
 
    <td>2</td><td>21</td><td>3</td><td>12-12-16</td> 
 
    </tr> 
 
    <tr> 
 
    <td>3</td><td>22</td><td>2</td><td>NULL</td> 
 
    </tr> 
 
    <tr> 
 
    <td>4</td><td>22</td><td>3</td><td>NULL</td> 
 
    </tr> 
 
    <tr> 
 
    <td>5</td><td>23</td><td>4</td><td>12-12-16</td> 
 
    </tr> 
 
    <tr> 
 
    <td>6</td><td>23</td><td>5</td><td>12-12-16</td> 
 
    </tr> 
 
</table>

现在鉴于我要补充新叫状态列,这是用于商店中的ID S-日期值的碱,如果一个存储有所有s-日期空值,则状态= 0 如果商店有所有s-日期不是null然后starus = 2,并且如果某个商店有不所有空S-日期,那么状态= 1,所以查看看起来像以下:

<table border="1"> 
 
    <tr> 
 
    <td>Id</td><td>store-id</td><td>prod-id</td><td>s-date</td><td>status</td> 
 
    </tr> 
 
    <tr> 
 
    <td>1</td><td>21</td><td>2</td><td>NULL</td><td>1</td> 
 
    </tr> 
 
    <tr> 
 
    <td>2</td><td>21</td><td>3</td><td>12-12-16</td><td>1</td> 
 
    </tr> 
 
    <tr> 
 
    <td>3</td><td>22</td><td>2</td><td>NULL</td><td>0</td> 
 
    </tr> 
 
    <tr> 
 
    <td>4</td><td>22</td><td>3</td><td>NULL</td><td>0</td> 
 
    </tr> 
 
    <tr> 
 
    <td>5</td><td>23</td><td>4</td><td>12-12-16</td><td>2</td> 
 
    </tr> 
 
    <tr> 
 
    <td>6</td><td>23</td><td>5</td><td>12-12-16</td><td>2</td> 
 
    </tr> 
 
</table>

+0

你究竟需要什么?该HTML表是您从前端应用程序接收到的对象(BLOB/CLOB)吗?你想创建一个解析该HTML表格的视图吗?既然你标记了'plsql',也许你想创建一个分析表的过程/函数? – AndrewMcCoist

+0

我认为HTML部分仅用于向我们展示用户如何获取数据。 – Nitish

+0

是的你的是正确的Nitish,HTML表格用于显示用户想要的数据。 – p27

回答

0

我已插入前四列中的数据到一个表STORE_DATA

SELECT A.*, TAB1.STATUS 
    FROM STORE_DATA A, 
     (SELECT T.STORE_ID, COUNT(T.S_DATE) STATUS 
      FROM STORE_DATA T 
     GROUP BY T.STORE_ID) TAB1 
WHERE A.STORE_ID = TAB1.STORE_ID; 

Count只会返回非空值。

0

我已经试过这对您的数据。

CREATE TABLE stores 
( 
    ID NUMBER(2), 
    store_id NUMBER(3), 
    proc_id NUMBER(3), 
    s_date DATE 
); 

INSERT INTO stores VALUES(1,21,2,NULL); 
INSERT INTO stores VALUES(2,21,3,TRUNC(SYSDATE)); 
INSERT INTO stores VALUES(3,22,2,NULL); 
INSERT INTO stores VALUES(4,22,3,NULL); 
INSERT INTO stores VALUES(5,23,4,TRUNC(SYSDATE)); 
INSERT INTO stores VALUES(6,23,5,TRUNC(SYSDATE)); 
COMMIT; 

您可以使用下面的创建视图。

CREATE VIEW stores_view 
AS 
SELECT s.id, 
     s.store_id, 
     s.proc_id, 
     s.s_date, 
     (CASE 
     WHEN (SELECT COUNT(1)  
       FROM stores s1  
       WHERE s1.store_id = s.store_id  
        AND s1.s_date IS NOT NULL) = 0 THEN 
       0 
     WHEN (SELECT COUNT(1)  
       FROM stores s1  
       WHERE s1.store_id = s.store_id  
        AND s1.s_date IS NULL) = 0 THEN  
       2  
     ELSE  
       1  
     END) status 
    FROM stores s;  
0

感谢所有的回复:

我必须解决这个问题类似以下内容:

首先我创建了一个函数来计算像以下状态:

FUNCTION CALC_STATUS(s_date_count IN NUMBER, store_count IN NUMBER)RETURN NUMBER 
AS 
    n_status NUMBER; 
BEGIN 
    IF s_date_count = 0 THEN 
    n_status  := 0; 
    RETURN n_status; 
    END IF; 
    IF s_date_count < store_count THEN 
    n_status  := 1; 
    RETURN n_status; 
    END IF; 
    IF s_date_count = store_count THEN 
    n_status  := 2; 
    RETURN n_status; 
    END IF; 
END CALC_STATUS; 

然后用户以上函数创建一个视图:

CREATE OR REPLACE VIEW V_SRORE (ID, STORE_ID, PROD_ID, S_DATE, STATUS) 
         AS 
    SELECT A.ID   AS ID, 
    A.STORE_ID  AS STORE_ID, 
    A.PROD_ID   AS PROD_ID, 
    A.S_DATE   AS S_DATE, 
    TEMP_TABLE.STATUS AS STATUS 
    FROM T_STORE A, 
    (SELECT B.STORE_ID, 
     CALC_STATUS(COUNT(B.S_DATE), COUNT(B.STORE_ID)) AS STATUS 
    FROM T_STORE B 
    GROUP BY B.STORE_ID 
    ) TEMP_TABLE 
    WHERE A.STORE_ID=TEMP_TABLE.STORE_ID 
    ORDER BY A.STORE_ID DESC;