表RECORD_INFO
|-------|-----------------------|
|NAME   |   DATE                |
|-------|-----------------------|
|b      |   2008-06-01 04:01:01 |
|a      |   2008-06-01 08:01:01 |
|c      |   2008-06-01 08:01:01 |
|b      |   2008-06-01 14:01:01 |
|a      |   2008-06-01 21:01:01 |
|b      |   2008-06-10 02:01:01 |
|a      |   2008-06-10 12:01:01 |
|a      |   2008-06-14 10:01:01 |
|a      |   2008-06-14 05:01:01 |
|a      |   2008-06-14 11:01:01 |
|b      |   2008-06-14 12:01:01 |
|c      |   2008-06-14 12:01:01 |
|b      |   2008-06-14 19:01:01 |
|b      |   2008-06-14 17:01:01 |
|c      |   2008-06-14 12:01:01 |
|-------|-----------------------|表NAME_INFO
|-------|---------|
|NAME   |   FEE   |
|-------|---------|
|a      |   8     |
|b      |   21    |
|c      |   12    |
|-------|---------|
要求写一个SQL语句,从上面两个表中得出如下结果(上述两个表根据NAME字段进行关联)
|-----------|---------|------|
|DATE       | NAME    | FEE  |
|-----------|---------|------|
|2008-06-01 | a       | 16   |
|2008-06-01 | b       | 42   |
|2008-06-01 | c       | 12   |
|2008-06-01 | 合计    | 70   |
|2008-06-10 | a       | 8    |
|2008-06-10 | b       | 21   |
|2008-06-10 | c       | 0    |
|2008-06-10 | 合计    | 29   |
|2008-06-14 | a       | 24   |
|2008-06-14 | b       | 63   |
|2008-06-14 | c       | 24   |
|2008-06-14 | 合计    | 111  |
|   --      | 总计    | 210  |
|-----------|---------|------|谁来作答?本题纯属技术讨论,顾没有给分,见谅!

解决方案 »

  1.   

    重发
    表RECORD_INFO
    ------------------------------
    NAME   |   DATE
    ------------------------------
    b      |   2008-06-01 04:01:01
    a      |   2008-06-01 08:01:01
    c      |   2008-06-01 08:01:01
    b      |   2008-06-01 14:01:01
    a      |   2008-06-01 21:01:01
    b      |   2008-06-10 02:01:01
    a      |   2008-06-10 12:01:01
    a      |   2008-06-14 10:01:01
    a      |   2008-06-14 05:01:01
    a      |   2008-06-14 11:01:01
    b      |   2008-06-14 12:01:01
    c      |   2008-06-14 12:01:01
    b      |   2008-06-14 19:01:01
    b      |   2008-06-14 17:01:01
    c      |   2008-06-14 12:01:01
    ------------------------------表NAME_INFO
    ----------------
    NAME  |    FEE
    ----------------
    a     |    8
    b     |    21
    c     |    12
    ----------------
    要求写一个SQL语句,从上面两个表中得出如下结果(上述两个表根据NAME字段进行关联)
    --------------------------
    DATE       | NAME   |  FEE
    --------------------------
    2008-06-01 | a      |  16
    2008-06-01 | b      |  42
    2008-06-01 | c      |  12
    2008-06-01 | 合计   |  70
    2008-06-10 | a      |  8
    2008-06-10 | b      |  21
    2008-06-10 | c      |  0
    2008-06-10 | 合计   |  29
    2008-06-14 | a      |  24
    2008-06-14 | b      |  63
    2008-06-14 | c      |  24
    2008-06-14 | 合计   |  111
       --      | 总计   |  210
    --------------------------
      

  2.   

    SELECT TO_CHAR(T1.V_DATE, 'yyyymmdd'),
           CASE
             WHEN T1.NAME IS NULL THEN
              '合计'
             ELSE
              T1.NAME
           END,
           SUM(T2.FEE)
      FROM RECORD_INFO T1,
           NAME_INFO   T2
     WHERE T1.NAME = T2.NAME
     GROUP BY ROLLUP(TO_CHAR(T1.V_DATE, 'yyyymmdd'), T1.NAME)
     ORDER BY TO_CHAR(T1.V_DATE, 'yyyymmdd');这样子基本上可以得出了....不过还有一点点问题...就是2008-06-10时显示不出c的值...
      

  3.   

    group+rollup+decode+grouping实现
      

  4.   

    用分析函数sum() over (partition by     order by )
      

  5.   


    4楼写的没什么错,可以将
    WHERE T1.NAME = T2.NAME 
    改写成
    WHERE T2.NAME = T1.NAME(+)
    这样c为0的值也会出现的 
      

  6.   

    CREATE TABLE record_info(NAME,dates) AS
    (
    select 'b' name, to_date('2008-06-01 04:01:01','yyyy-mm-dd hh24:mi:ss') dates from dual UNION ALL
    select 'a' name, to_date('2008-06-01 08:01:01','yyyy-mm-dd hh24:mi:ss') dates from dual UNION ALL
    select 'c' name, to_date('2008-06-01 08:01:01','yyyy-mm-dd hh24:mi:ss') dates from dual UNION ALL
    select 'b' name, to_date('2008-06-01 14:01:01','yyyy-mm-dd hh24:mi:ss') dates from dual UNION ALL
    select 'a' name, to_date('2008-06-01 21:01:01','yyyy-mm-dd hh24:mi:ss') dates from dual UNION ALL
    select 'b' name, to_date('2008-06-10 02:01:01','yyyy-mm-dd hh24:mi:ss') dates from dual UNION ALL
    select 'a' name, to_date('2008-06-10 12:01:01','yyyy-mm-dd hh24:mi:ss') dates from dual UNION ALL
    select 'a' name, to_date('2008-06-14 10:01:01','yyyy-mm-dd hh24:mi:ss') dates from dual UNION ALL
    select 'a' name, to_date('2008-06-14 05:01:01','yyyy-mm-dd hh24:mi:ss') dates from dual UNION ALL
    select 'a' name, to_date('2008-06-14 11:01:01','yyyy-mm-dd hh24:mi:ss') dates from dual UNION ALL
    select 'b' name, to_date('2008-06-14 12:01:01','yyyy-mm-dd hh24:mi:ss') dates from dual UNION ALL
    select 'c' name, to_date('2008-06-14 12:01:01','yyyy-mm-dd hh24:mi:ss') dates from dual UNION ALL
    select 'b' name, to_date('2008-06-14 19:01:01','yyyy-mm-dd hh24:mi:ss') dates from dual UNION ALL
    select 'b' name, to_date('2008-06-14 17:01:01','yyyy-mm-dd hh24:mi:ss') dates from dual UNION ALL
    select 'c' name, to_date('2008-06-14 12:01:01','yyyy-mm-dd hh24:mi:ss') dates from dual);CREATE TABLE name_info(NAME,fee) AS
    (
    SELECT 'a' NAME,  8 fee FROM dual UNION
    SELECT 'b' NAME, 21 fee FROM dual UNION
    SELECT 'c' NAME, 12 fee FROM dual) SQL> SELECT A.DATES,DECODE(GROUPING_id(a.DATES,a.NAME),1,'合计',3,'总计',A.NAME) name,sum(NVL(A.FEE*B.RN,0)) FEE FROM
      2    (SELECT * FROM (select DISTINCT TRUNC(DATES)  DATES FROM record_info) A,
      3                   (SELECT * FROM NAME_INFO) B
      4                     ORDER BY TRUNC(DATES),NAME) A,
      5    (SELECT TRUNC(DATES)  DATES,NAME,COUNT(*) RN FROM RECORD_INFO GROUP BY TRUNC(DATES),NAME ) B
      6  WHERE A.DATES=B.DATES(+) AND A.NAME=B.NAME(+)
      7  GROUP BY ROLLUP(a.DATES,a.NAME)
      8  /DATES       NAME        FEE
    ----------- ---- ----------
    2008/06/01  a            16
    2008/06/01  b            42
    2008/06/01  c            12
    2008/06/01  合计     70
    2008/06/10  a             8
    2008/06/10  b            21
    2008/06/10  c             0
    2008/06/10  合计      29
    2008/06/14  a            24
    2008/06/14  b            63
    2008/06/14  c            24
    2008/06/14  合计     111
                      总计      21013 rows selectedSQL>
      

  7.   

    11楼的方法确实可以,不过有一个问题:
    SELECT *
      FROM (SELECT DISTINCT TRUNC(V_DATE) V_DATE
              FROM RECORD_INFO) A,
           (SELECT *
              FROM NAME_INFO) B
     ORDER BY TRUNC(V_DATE),
              NAME
    这个产生笛卡尔积(当然这样做是相当于产生了一个日期,FEE的参照表),但是如果数据量很大时就会出问题了,有可能会把TEMP空间撑爆,
    有没有什么更好的方法???
      

  8.   

    在那个SQL基础上改成左或者右连接确实不行的,我开始就试过了...可以参照11楼高人的做法,可以实现...