2016-08-08 15 views
0

私はこのExcelドキュメントを持っていると私は別々のテーブルにそれらを置くために、このコードを使用し、その後、私は私のデータベースにそのファイルからシートをインポート:一意の値を使用してデータの複製を停止する方法はありますか?

insert into LP_Pending_Info(Service_order,Company,Country , HQ_AgingBase_Date ,PENDING_DAYS, Posting_Date,Service_Type,Service_TypeText,SUB_SVC_Type,Status,Status_Text,Reason,Reason_Text,Reason_Aging,SVC_Comment,ASC_Code,ASC_Name,ASC_JobNo,Model,CIC_Product,SerialNo,IN_OUT_WTY,IMEI,Defect_DESC,Detail_Type,Detail_TypeText,Repair_RCV_DT,Repair_RCV_TM,Complete_DT,SVC_Level,Consumer,Consumer_Text,TelNumber,City1,Street,Engineer_Code) 
select Service_order,Company,Country , [HQ aging base date] ,PENDING_DAYS, Posting_Date,Service_Type,SERVICE_TYPE_TXT,SUB_SVC_Type,Status,Status_Text,Reason,Reason_Text,Reason_Aging,SVC_Comment,[ASC code],[ASC 

name],ASC_JOB_NO,Model,CIC_PRD,SERIAL_NO,INOUTWTY,IMEI,Defect_DESC,Detail_Type,DETAIL_TYPE_TEXT,Repair_RCV_DT,Repair_RCV_TM,Complete_DT,SVC_Level,Consumer,consumer_txt,TEL_NUMBER,City1,Street,[Engineer code] 
    from LP_Pending_Jobs; 

insert into LP_Part_Codes(Service_order, PartCode,serPluspart) 
select Service_order, Part_code , CONVERT(nvarchar(150), Service_order)+Part_code 
from LP_Pending_Jobs 
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; 

insert into LP_PS_Codes(Service_Order, PS) 
select Service_order,PS 
from LP_Pending_Jobs 
cross apply (
    select PS1 as PS where len(PS1)>0 
    union all 
    select PS2 where len(PS2) > 0 
    union all 
    select PS3 where len(PS3) > 0 
    union all 
    select PS4 where len(PS4) > 0 
    union all 
    select PS5 where len(PS5) > 0 
) unp; 


insert into LP_Confirmation_Codes(Service_Order, SO_NO) 
select Service_order,SO 
from LP_Pending_Jobs 
cross apply (
    select confirmation_No1 as SO where len(confirmation_No1)>0 
    union all 
    select SO_NO2 where len(SO_NO2) > 0 
    union all 
    select SO_NO3 where len(SO_NO3) > 0 
    union all 
    select SO_NO4 where len(SO_NO4) > 0 
    union all 
    select SO_NO5 where len(SO_NO5) > 0 
) unp; 

---------------- 
insert into LP_QTY(Service_Order, QTY) 
select Service_order,QTY 
from LP_Pending_Jobs 
cross apply (
    select QTY1 as QTY where len(QTY1)>0 
    union all 
    select QTY2 where len(QTY2) > 0 
    union all 
    select QTY3 where len(QTY3) > 0 
    union all 
    select QTY4 where len(QTY4) > 0 
    union all 
    select QTY5 where len(QTY5) > 0 
) unp; 


insert into LP_ASC_PO_Codes(Service_Order, ASC_PO_NO) 
select Service_order,ASC_PO 
from LP_Pending_Jobs 
cross apply (
    select ASC_PO_No1 as ASC_PO where len(ASC_PO_No1)>0 
    union all 
    select ASC_PO_No2 where len(ASC_PO_No2) > 0 
    union all 
    select ASC_PO_No3 where len(ASC_PO_No3) > 0 
    union all 
    select ASC_PO_No4 where len(ASC_PO_No4) > 0 
    union all 
    select ASC_PO_No5 where len(ASC_PO_No5) > 0 
) unp; 


insert into LP_PO_Date(Service_Order, PO_Date) 
select Service_order,PO_Date 
from LP_Pending_Jobs 
cross apply (
    select PO_DATE1 as PO_Date where len(PO_DATE1)>0 
    union all 
    select PO_DATE2 where len(PO_DATE2) > 0 
    union all 
    select PO_DATE3 where len(PO_DATE3) > 0 
    union all 
    select PO_DATE4 where len(PO_DATE4) > 0 
    union all 
    select PO_DATE5 where len(PO_DATE5) > 0 
) unp; 


insert into LP_SO_Date(Service_Order, SO_Date) 
select Service_order,SO_Date 
from LP_Pending_Jobs 
cross apply (
    select SO_DATE1 as SO_Date where len(SO_DATE1)>0 
    union all 
    select SO_DATE2 where len(SO_DATE2) > 0 
    union all 
    select SO_DATE3 where len(SO_DATE3) > 0 
    union all 
    select SO_DATE4 where len(SO_DATE4) > 0 
    union all 
    select SO_DATE5 where len(SO_DATE5) > 0 
) unp; 

とデータの1行であるので、私はクロスが適用されます使用各データを別々の列に入れます。 問題は私がそれらに参加したときに始まります。なぜなら、より多くのデータを表示する必要があるからです。 は、ここで選択したコードです:

select distinct LP_Pending_Info.Service_Order,LP_Pending_Info.Pending_Days, 
LP_Pending_Info.Service_Type,LP_Pending_Info.ASC_Code,LP_Pending_Info.Model, 
LP_Pending_Info.IN_OUT_WTY, LP_Part_Codes.PartCode,LP_PS_Codes.PS, 
LP_Confirmation_Codes.SO_NO,LP_Pending_Info.Engineer_Code,serPluspart 
from LP_Pending_Info 
inner join LP_Part_Codes on LP_Pending_Info.Service_order = LP_Part_Codes.Service_order 
inner join LP_PS_Codes on LP_Part_Codes.Service_Order = LP_PS_Codes.Service_Order 
inner join LP_Confirmation_Codes on LP_PS_Codes.Service_Order = LP_Confirmation_Codes.Service_Order 
order by LP_Pending_Info.Service_order; 

私は周りに頼み、私は一意の列を必要とし、このポイントに来るので、私は

「serPluspart」

このコラムを追加しました私のテーブルに私の問題を解決することを願っていますが、私が選択したものを使うと余分なデータが表示されます。私はそれが2つの部品コードを持っているので、部品コード'4182134076'は2行を持つべきで絵を見ることで、5つの部分のコードを持っていますが、それは、そのサービスを示して一番上にすべてのサービスオーダのため enter image description here

: は、ここでは最初の25レコードです8回注文して、私はそれを修正する方法を知らない。何か提案を感謝します。 この'4182134076'サービスオーダのためのエクセル入力ファイル: - ; PS - P GH81-13601AやGH96-09938Aあなたがバイナリの選択肢(PartCodeの3ペアを持っているので、

Service_order PENDING_DAYS SERVICE_TYPE ASC code MODEL INOUTWTY Part_code1 PS1 ASC_PO_No1 confirmation_No1 QTY1 PO_DATE1 SO_DATE1 Part_code2 PS2 ASC_PO_No2 SO_NO2 QTY2 PO_DATE2 SO_DATE2 Part_code3 PS3 ASC_PO_No3 SO_NO3 QTY3 PO_DATE3 SO_DATE3 Part_code4 PS4 ASC_PO_No4 SO_NO4 QTY4 PO_DATE4 SO_DATE4 Part_code5 PS5 ASC_PO_No5 SO_NO5 QTY5 PO_DATE5 SO_DATE5 Engineer code 

4182134076    36    CI  4285818 SM-A310FZDDTHR LP  GH96-09938A P 4182134076/1 1000237676   1 09.07.2016    GH81-13601A U 4182134076 1000224921 1 05.06.2016                                                        7086002211 

答えて

2

出力を見ると、あなたは8行を期待しますまたはU; SO_NO 1000224921または1000237676)。 PartCode、PS、およびSO_NOは3つの異なるテーブルから来ており、inner_joinだけがservice_orderにあるので、2^3行が得られます。データを見ることなく、何が間違っているのかを正確に言うのは難しいですが、テーブルがないにもかかわらず、これらの3つの要素がリンクされていると2つの行しか期待していないとします。私はいくつかの外部キーが必要だと思っていますが、いくつかのサンプルデータがなければ、わかりません。

OK入力データを見て私は何をすべきか知っています! LP_Part_Codesでは、あなたのカラムserPluspartを取り除きます(それは助けにはなりません)。次に、LP_Part_Codes、LP_PS_Codes、およびLP_Confirmation_CodesのそれぞれにSubOrder(smallint)を追加します。

次は、例えば、あなたのアンピボットに列を追加します。

insert into LP_PS_Codes(Service_Order, PS, SubOrder) 
select Service_order,PS,SubOrder 
from LP_Pending_Jobs 
cross apply (
select PS1 as PS, 1 AS SubOrder where len(PS1)>0 
union all 
select PS2, 2 AS SubOrder where len(PS2) > 0 
union all 
select PS3, 3 AS SubOrder where len(PS3) > 0 
union all 
select PS4, 4 AS SubOrder where len(PS4) > 0 
union all 
select PS5, 5 AS SubOrder where len(PS5) > 0 
) unp; 

がLP_Part_CodesとLP_Confirmation_Codesために同じことを行います。

今、あなたはLP_Part_Codes.SubOrder = LP_PS_Codes.SubOrder = LP_Confirmation_Codes.SubOrder

を追加して、メインの選択を修正することができますし、今、このための唯一の2つのレコードがあります。

HTH

ジョナサン

+0

私は主キーとしてサービスオーダでテーブルを接続するために関係を使用。どのようにサンプルデータが必要ですか? –

+0

サービス指図4182134076の入力データ(つまり、Excelシートデータ)を転記できるだけであれば十分です。私が書いたように、Excelシートでは一意ではないと思われる、同じサービスオーダーのすべてにリンクされた3つの別々のテーブルは、複数の結果をもたらします。私はあなたがservice_orderとservice_sub_orderでユニークである必要があると強く思っています。 –

+0

質問の最後にそのサービスオーダーのExcel部分を追加しました。 –

関連する問題