按列复制表中的行

时间:2016-07-23 09:46:55

标签: sql excel sql-server-2012 excel-formula

我需要开发一个报告,我在excel中创建它,但它变得如此沉重,即使我的电脑也无法打开它。 现在我决定用SQL创建它。 excel输入是这样的:

Service_order   PENDING_DAYS    SERVICE_TYPE    ASC code    INOUTWTY    Part_code1  Part_code2  Part_code3  Part_code4  Part_code5

    4182864919        18              CI         3440690        LP      GH82-11218A GH96-09406A GH81-13594A GH02-11552A GH02-11553A
    4182868153        18              CI         4285812        LP      GH97-17670B             
    4182929636        17              CI         4276987        LP      GH97-17260C GH02-10203A         
    4182953067        16              CI         3440690        LP      GH97-17940C             
    4182954688        16              CI         6195657        LP      GH82-10555A GH97-17852A GH81-13071A     
    4182955036        16              PS         6195657        LP      GH97-17940C             

以及使用此代码的结果

=HLOOKUP(Sheet3!A$1;Sheet3!$A$1:$F$10000;CEILING((ROW()-ROW(Sheet3!$A$1))/5+1;1);FALSE)"

=OFFSET(WholePart;TRUNC((ROW()-ROW($G$2))/COLUMNS(WholePart));MOD(ROW()-ROW($G$2);COLUMNS(WholePart));1;1)

* WholePart是partCode值。

是这样的:   enter image description here

我想要做的是转换这些公式或输出就像这样。 欣赏它。

1 个答案:

答案 0 :(得分:1)

我的建议是在EXCEL中准备数据并加载到规范化表中。然后你可以通过加入表来获得结果。

create table T1(
    Service_order bigint primary key,
    PENDING_DAYS int,
    SERVICE_TYPE varchar(10),
    ASC_code int,
    INOUTWTY varchar(10)
    );
create table T2(
    Service_order bigint,
    Part_code varchar(50)
    );

insert into T1(Service_order, PENDING_DAYS, SERVICE_TYPE, ASC_code, INOUTWTY)
values
    (4182864919 , 18,'CI',3440690,'LP'),
    (4182868153 , 18,'CI',4285812,'LP'),
    (4182929636 , 17,'CI',4276987,'LP'),
    (4182953067 , 16,'CI',3440690,'LP'),
    (4182954688 , 16,'CI',6195657,'LP'),
    (4182955036 , 16,'PS',6195657,'LP');
insert into T2(Service_order, Part_code)
values
    (4182864919,'GH82-11218A'),
    (4182864919,'GH96-09406A'),
    (4182864919,'GH81-13594A'),
    (4182864919,'GH02-11552A'),
    (4182864919,'GH02-11553A'),
    (4182868153,'GH97-17670B'),
    (4182929636,'GH97-17260C'), 
    (4182929636,'GH02-10203A'),
    (4182953067,'GH97-17940C'), 
    (4182954688,'GH82-10555A'),
    (4182954688,'GH97-17852A'), 
    (4182954688,'GH81-13071A'),
    (4182955036,'GH97-17940C')

select T1.*, T2.Part_code
from T1
join T2 on T1.Service_order = T2.Service_order
order by T1.Service_order, T2.Part_code;

编辑

或者,您可以加载原始EXCEL数据(第一个表),并在SQL中对其进行规范化。

-- create normalized tables
create table T1(
    Service_order bigint primary key,
    PENDING_DAYS int,
    SERVICE_TYPE varchar(10),
    ASC_code int,
    INOUTWTY varchar(10)
    );
create table T2(
    Service_order bigint,
    Part_code varchar(50)
    );

-- load data from excel.
create table excelData(
    Service_order bigint,
    PENDING_DAYS int,
    SERVICE_TYPE varchar(10),
    ASC_code int,
    INOUTWTY varchar(10),
    Part_code1 varchar(50),
    Part_code2 varchar(50),
    Part_code3 varchar(50),
    Part_code4 varchar(50),
    Part_code5 varchar(50)    
    );

-- Below i use sample data insert instead of load.    
insert into excelData(Service_order, PENDING_DAYS, SERVICE_TYPE, ASC_code, INOUTWTY
                   ,Part_code1, Part_code2, Part_code3, Part_code4, Part_code5)
values
    (4182864919 , 18,'CI',3440690,'LP','GH82-11218A','GH96-09406A','GH81-13594A','GH02-11552A','GH02-11553A'),
    (4182868153 , 18,'CI',4285812,'LP','GH97-17670B','','','',''),
    (4182929636 , 17,'CI',4276987,'LP','GH97-17260C','GH02-10203A','','',''),
    (4182953067 , 16,'CI',3440690,'LP','GH97-17940C','','','',''),
    (4182954688 , 16,'CI',6195657,'LP','GH82-10555A','GH97-17852A','GH81-13071A','',''),
    (4182955036 , 16,'PS',6195657,'LP','GH97-17940C','','','','');

-- store loaded data into normalized tables.

insert into T1(Service_order, PENDING_DAYS, SERVICE_TYPE, ASC_code, INOUTWTY)
select Service_order, PENDING_DAYS, SERVICE_TYPE, ASC_code, INOUTWTY
from excelData;

insert into T2(Service_order, Part_code)
select Service_order, Part_code
from excelData
cross apply (
    --unpivot
    select Part_code1 as Part_code where len(Part_code1) > 0
    union all
    select Part_code2 where len(Part_code2) > 0
    union all
    select Part_code3 where len(Part_code3) > 0
    union all
    select Part_code4 where len(Part_code4) > 0
    union all
    select Part_code5 where len(Part_code5) > 0
) unp;

-- check it
select * from T1;
select * from T2;