各位大哥大姐 我有个sql不知道怎么写了 琢磨了半天也没没整出来,现在跟大哥说说,给提供个解决办法我有两个表 一个title表 一个value表title表字段如下:
datacode varchar(30), -主键
row   int,     记录标题的序号
titleval varchar(30)   -标题的名字
value表字段如下:
datacode varchar(30)  -主键
row int -主键  行值
col int -主键  列值
datavalue  --标题对应的数值
比如有如下数据:title表:datacode     row     titleval 
------------------------------
  aaa         1        列1
  aaa         2        列2
  aaa         3        列3  bbb         1        列3
  bbb         2        列1
  bbb         3        列2
value表:datacode    row   col    value
-------------------------------
  aaa        1     1       1
  aaa        1     2       3
  aaa        1     3       5
  aaa        2     1       2
  aaa        2     2       4
  aaa        2     3       6  bbb        1     1       5
  bbb        1     2       6
  bbb        1     3       3
  bbb        2     1       2
  bbb        2     2       3
  bbb        2     3       4       
把这两个表转成自己理解的矩阵 就是如下情况:
datacode   列1  列2  列3               datacode   列3  列1   列2
-------------------------              -------------------------
  aaa       1     4   6                  bbb       5    6    3
  aaa       2     3   5                  bbb       2    3    4
现在需求是 把datacode =bbb 的数据做为参照样本 对 datacode=aaa的数据 进行参照性删除 
生成新的datacode分别插入到title表和value表
参照性删除的要求是:
页面可以选择 参照数据 bbb 的 列   比如 选择了bbb  “列3” 这个标题
则 根据 bbb “列3” 的 5 在 aaa 的 “列3”中查找  如果存在 则删除 aaa 的整行数据,
然后 比较 bbb “列3”的2 在 aaa 的  “列3”中查找 如果存在 则删除 aaa 的整行数据,删除后的 aaa数据如下:datacode   列1  列2  列3              
-------------------------             
  aaa       1     3   6    
页面可以选择 参照数据 bbb 的 列   比如 选择了bbb  “列3”和“列2” 这两个标题     删除后的 aaa数据如下:datacode   列1  列2  列3              
-------------------------             
  aaa       1     3   6            请教大侠们 这个sql怎么写 实在是整不出来了。。

解决方案 »

  1.   


    可以提供建表语句和相关的INSERT语句么?这样子别人能够更容易帮助你. 或者with语句也可以
      

  2.   

    create table MM_DATATITLE
    (
        DataCode            VARCHAR(25)            not null,
        Row                 INTEGER                not null,
        TitleVal            VARCHAR(60),
        TitleType           CHAR(1),
       constraint  P_Key_1  primary key ( DataCode ,  Row )
    )
    in TBS1
     index in TBS_IDX;create table MM_DATAVALUE
    (
        DataCode            VARCHAR(25)            not null,
        Col                 INTEGER                not null,
        Row                 INTEGER                not null,
        DataVal             VARCHAR(60),
       constraint  P_Key_1  primary key ( DataCode ,  Col ,  Row )
    )
    in TBS1
     index in TBS_IDX;
      

  3.   


    你需要一条SQL搞定呢?还是需要PL/SQL搞定呢? 为什么必须要转行列转换呢?
      

  4.   

    两条sql搞定 
    一个往title表插
    一个往value表插
    不是必须用行专列 ,只要能实现就好了。,呵呵呵
      

  5.   

    WITH TITLE AS(
      SELECT 'AAA' AS DATACODE,1 AS ROWW,'列1' AS TITLEVAL FROM DUAL UNION ALL
      SELECT 'AAA' AS DATACODE,2 AS ROWW,'列2' AS TITLEVAL FROM DUAL UNION ALL
      SELECT 'AAA' AS DATACODE,3 AS ROWW,'列3' AS TITLEVAL FROM DUAL UNION ALL
      SELECT 'BBB' AS DATACODE,1 AS ROWW,'列3' AS TITLEVAL FROM DUAL UNION ALL
      SELECT 'BBB' AS DATACODE,2 AS ROWW,'列1' AS TITLEVAL FROM DUAL UNION ALL
      SELECT 'BBB' AS DATACODE,3 AS ROWW,'列2' AS TITLEVAL FROM DUAL
    )
    SELECT * FROM TITLE;
    WITH VALUE AS(
      SELECT 'AAA' AS DATACODE,1 AS ROWW,1 AS COL,1 AS VALUE FROM DUAL UNION ALL
      SELECT 'AAA' AS DATACODE,1 AS ROWW,2 AS COL,3 AS VALUE FROM DUAL UNION ALL
      SELECT 'AAA' AS DATACODE,1 AS ROWW,3 AS COL,5 AS VALUE FROM DUAL UNION ALL
      SELECT 'AAA' AS DATACODE,2 AS ROWW,1 AS COL,2 AS VALUE FROM DUAL UNION ALL
      SELECT 'AAA' AS DATACODE,2 AS ROWW,2 AS COL,4 AS VALUE FROM DUAL UNION ALL
      SELECT 'AAA' AS DATACODE,2 AS ROWW,3 AS COL,6 AS VALUE FROM DUAL UNION ALL
      SELECT 'BBB' AS DATACODE,1 AS ROWW,1 AS COL,5 AS VALUE FROM DUAL UNION ALL
      SELECT 'BBB' AS DATACODE,1 AS ROWW,2 AS COL,6 AS VALUE FROM DUAL UNION ALL
      SELECT 'BBB' AS DATACODE,1 AS ROWW,3 AS COL,3 AS VALUE FROM DUAL UNION ALL
      SELECT 'BBB' AS DATACODE,2 AS ROWW,1 AS COL,2 AS VALUE FROM DUAL UNION ALL
      SELECT 'BBB' AS DATACODE,2 AS ROWW,2 AS COL,3 AS VALUE FROM DUAL UNION ALL
      SELECT 'BBB' AS DATACODE,2 AS ROWW,3 AS COL,4 AS VALUE FROM DUAL
    )
    SELECT * FROM VALUE;
    上面是两张你的表的模拟数据,把你希望得到的结果和操作步骤详细的再说一下吧,比如,做什么操作之后,期望的数据是什么样子的.
      

  6.   


    比如:
    现在有两个矩阵   一个是参照的数据 另个是要进行对其参数的数据 
    标题对应在title表中
    标题对应的值在 value表中
    现在在页面上我有个选项 就是可以选择这个参数数据的标题(title表中的titlevalue字段)还拿上面的数据来说 :     要进行删除的 --xxx                        参照的数据--yyy
    datacode   列1  列2  列3               datacode   列3  列1   列2
    -------------------------              -------------------------
      aaa       1     4   6                  bbb       5    6    3
      aaa       2     3   5                  bbb       2    3    4
    1.我选择了要参照的数据(yyy)的  列2 这列  那么列2中 有 3和4  
    拿 3比较  要进行删除的(xxx)的 列2  xxx的列2 也有3 那么 删除xxx的 第2行数据然后yyy的列2中的4 在 xxx的列2中也存在 那么 xxx的 第一行数据要删除进行完上述操作后 等于 没有数据需要插入到title和value两个表了2.我选择了要参照的数据(yyy)的  列2和列3 这两列  在 yyy中 列2中的3 和列3中的 5属于同一行数据  他们和xxx中的列2和列3 的值相等  那么删除xxx中的这一整行数据 只保留xxx中的第一行数据  ,把保留的xxx的第一行数据 生成新的datacode 然后把相应的title表字段和value表字段 依据xxx的title字段和value字段 插入到title表和value表以上两点不是对xxx表进行删除 是把比较后得到的数据 再插入到title和value表 datacode生成个新的
     
      

  7.   

    拿参照数据(yyy) 比较 (xxx) 根据上面规则 生成 zzz 新数据到 title表和value表
      

  8.   

    比如:
    现在有两个矩阵   一个是参照的数据 另个是要进行对其参数的数据 
    标题对应在title表中
    标题对应的值在 value表中
    现在在页面上我有个选项 就是可以选择这个参数数据的标题(title表中的titlevalue字段)还拿上面的数据来说 :     要进行删除的 --xxx                        参照的数据--yyy
    datacode   列1  列2  列3               datacode   列3  列1   列2
    -------------------------              -------------------------
      aaa       1     4   6                  bbb       5    6    3
      aaa       2     3   5                  bbb       2    3    4
    1.我选择了要参照的数据(yyy)的  列2 这列  那么列2中 有 3和4  
    拿 3比较  要进行删除的(xxx)的 列2  xxx的列2 也有3 那么 删除xxx的 第2行数据然后yyy的列2中的4 在 xxx的列2中也存在 那么 xxx的 第一行数据要删除进行完上述操作后 等于 没有数据需要插入到title和value两个表了2.我选择了要参照的数据(yyy)的  列2和列3 这两列  在 yyy中 列2中的3 和列3中的 5属于同一行数据  他们和xxx中的列2和列3 的值相等  那么删除xxx中的这一整行数据 只保留xxx中的第一行数据  ,把保留的xxx的第一行数据 生成新的datacode 然后把相应的title表字段和value表字段 依据xxx的title字段和value字段 插入到title表和value表以上两点不是对xxx表进行删除 是把比较后得到的数据 再插入到title和value表 datacode生成个新的拿参照数据(yyy) 比较 (xxx) 根据上面规则 生成 zzz 新数据到 title表和value表 
      

  9.   

    title表字段如下:
    datacode varchar(30), -主键
    row   int,     记录标题的序号  --这个应该是col吧
    titleval varchar(30)   -标题的名字
      

  10.   

    果然只要一句--create table
    CREATE GLOBAL TEMPORARY TABLE MM_DATATITLE
    (
        DataCode            VARCHAR(25)            not null,
        Roww                 INTEGER                not null,
        TitleVal            VARCHAR(60),
        TitleType           CHAR(1),
       constraint  P_Key_1  primary key ( DataCode ,  Roww )
    )on commit delete rows;
    CREATE GLOBAL TEMPORARY table MM_DATAVALUE
    (
        DataCode            VARCHAR(25)            not null,
        Col                 INTEGER                not null,
        Roww                 INTEGER                not null,
        DataVal             VARCHAR(60),
       constraint  P_Key_2  primary key ( DataCode ,  Col ,  Roww )
    )on commit delete rows;--insert into data
    insert into MM_DATATITLE(DataCode,Roww,Titleval)values('aaa',1,'列1');
    insert into MM_DATATITLE(DataCode,Roww,Titleval)values('aaa',2,'列2');
    insert into MM_DATATITLE(DataCode,Roww,Titleval)values('aaa',3,'列3');
    insert into MM_DATATITLE(DataCode,Roww,Titleval)values('bbb',1,'列3');
    insert into MM_DATATITLE(DataCode,Roww,Titleval)values('bbb',2,'列2');
    insert into MM_DATATITLE(DataCode,Roww,Titleval)values('bbb',3,'列1');
    insert into MM_DATAVALUE(DataCode,Roww,Col,dataval)values('aaa',1,1,1);
    insert into MM_DATAVALUE(DataCode,Roww,Col,dataval)values('aaa',1,2,3);
    insert into MM_DATAVALUE(DataCode,Roww,Col,dataval)values('aaa',1,3,5);
    insert into MM_DATAVALUE(DataCode,Roww,Col,dataval)values('aaa',2,1,2);
    insert into MM_DATAVALUE(DataCode,Roww,Col,dataval)values('aaa',2,2,4);
    insert into MM_DATAVALUE(DataCode,Roww,Col,dataval)values('aaa',2,3,6);
    insert into MM_DATAVALUE(DataCode,Roww,Col,dataval)values('bbb',1,1,5);
    insert into MM_DATAVALUE(DataCode,Roww,Col,dataval)values('bbb',1,2,6);
    insert into MM_DATAVALUE(DataCode,Roww,Col,dataval)values('bbb',1,3,3);
    insert into MM_DATAVALUE(DataCode,Roww,Col,dataval)values('bbb',2,1,2);
    insert into MM_DATAVALUE(DataCode,Roww,Col,dataval)values('bbb',2,2,3);
    insert into MM_DATAVALUE(DataCode,Roww,Col,dataval)values('bbb',2,3,4);--show datecode,row number,value
    select * from MM_DATAVALUE;
    select v.datacode,v.roww
    ,sum(decode(v.col,1,v.dataval,0)) "列1"
    ,sum(decode(v.col,2,v.dataval,0)) "列2"
    ,sum(decode(v.col,3,v.dataval,0)) "列3"
    from MM_DATAVALUE v
    group by v.datacode,v.roww
    order by v.datacode,v.roww;--show same data
    --'aaa'(select col 2) & 'bbb'(select col 2) 交集
    select *
    from MM_DATAVALUE a, MM_DATAVALUE b
    where a.datacode='aaa' and a.col=2 
      and b.datacode='bbb' and b.col=2
      and a.dataval=b.dataval;
      
    -- datacode 'aaa' - datecode 'bbb' 差集
    -- a - b = a - ( a & b )
    select * from MM_DATAVALUE c
    where c.roww not in(
    select a.roww
    from MM_DATAVALUE a, MM_DATAVALUE b
    where a.datacode='aaa' and a.col=2 
      and b.datacode='bbb' and b.col=2
      and a.dataval=b.dataval
    )and datacode='aaa'