0

oracle中如何使用SQL将第一张表转换为第二张表?

对于第一个表,它具有三个列,分别称为 Time、TotalUsers 和 Department。对于 Department 列,它只有两种类型的值,一种是 *,另一种是 null。我需要将带有 * 的 TotalUsers 设置为 TotalUsersStar,并将带有 null 的 TotalUsers 设置为第二个表中的 TotalUsersNull。请看第二张表。

第一张表:

Date      TotalUsers        Department
199905      1234                 *
199912      2345                 *
200005      8923               (null)
200012      6783               (null)

第二张表:

Date         TotalUsersNull       TotalUsersStar
199905                                1234
199912                                2345
200005         8923
200012         6783
4

3 回答 3

3

这只是一个查询。

SELECT Date_, 
       CASE WHEN Department IS NULL THEN TotalUsers END TotalUsersNull,
       CASE WHEN Department = '*'   THEN TotalUsers END TotalUsersStar    
FROM First;

请注意,我使用的是字段名称Date_,因为 Oracle 不太喜欢将数据类型用作名称。

要创建一个新表,您将需要这样的东西(假设您拥有所有权限):

CREATE TABLE Second
    (Date_ int, TotalUsersNull int, TotalUsersStar int)
;

INSERT INTO Second (Date_, TotalUsersNull, TotalUsersStar)
SELECT Date_, 
       CASE WHEN Department IS NULL THEN TotalUsers END TotalUsersNull,
       CASE WHEN Department = '*'   THEN TotalUsers END TotalUsersStar    
FROM First;

为简单起见,我将Date_字段定义为int.

请参阅我的SQLFiddle 演示

于 2013-09-12T03:46:41.080 回答
0

像这样试试

WITH
     t AS
     ( SELECT TO_DATE('199905','YYYYMM') date_, 1234 total_users, '*' department FROM DUAL
     UNION
     SELECT TO_DATE('199912','YYYYMM'), 2345, '*' FROM dual
     UNION
     SELECT TO_DATE('200005','YYYYMM'), 8923, NULL FROM dual
     UNION
     SELECT TO_DATE('200012','YYYYMM'), 6783, NULL FROM dual
     )
SELECT
     DATE_,
     CASE
          WHEN department = '*'
          THEN NULL
          WHEN department IS NULL
          THEN total_users
     END TotalUsersNull,     
     CASE
          WHEN department = '*'
          THEN total_users
          WHEN department IS NOT NULL
          THEN NULL
     END TotalUsersStar
FROM
     t;
于 2013-09-12T03:42:34.547 回答
0

这很简单——

CREATE TABLE second AS
SELECT date
     , CASE department
         WHEN NULL THEN totalUsers
         ELSE NULL
       END AS TotalUsersNull
     , CASE department
         WHEN '*' THEN  totalUsers
         ELSE NULL
       END AS TotalUsersStar
  FROM first;

欲了解更多信息,请单击此处此处

于 2013-09-12T10:19:44.420 回答