3

3列のテーブルオーダーがあります

  BookCode  Quantity  Billno
  --------------------------    
   Ed001        2      A1
   Ed002        3      A1
   Ed003        1      A1
   py001        5      A2
   ed001        1      A2
   ed005        2      A2
   ed003        4      A2

今、結果をユーザーに表示したい

結果

   BookCode   A1     A2
   ----------------------    
   Ed001      2      1
   Ed002      3      0
   Ed003      1      4
   py001      0      5
   ed005      0      1

結果は私の一時テーブルです。それを変更して、に従って列を追加しますBillno

これはうまくいきます

今、テーブルから選択BookCodeして結果に挿入しますQuantityOrder

既に存在する場合は、結果bookcodeテーブルを更新するだけで、そうでない場合はそのブックコードで新しい行を挿入する必要があります。

そのためにはどうすればよいですか?

4

2 に答える 2

3

カーソルを使用して解決しました..

create table #Result(BookCode varchar(20),BookRate float)
create table #bill(bilno varchar(max) )
insert into #bill ('A1')
insert into #bill ('A2')

    SET @Ordnum = CURSOR FOR
        SELECT bilno FROM #bill 
                OPEN @Ordnum
            FETCH NEXT
            FROM @Ordnum INTO @billno
                WHILE @@FETCH_STATUS = 0
                 BEGIN                  
                        EXEC ('ALTER TABLE #temp ADD [' + @billno+ '] varchar(30)') 
                            SET @getbookcode = CURSOR FOR
                                SELECT BookCode , BookQuantity , BookRate FROM OrderDetail where BillNo = @billno
                            OPEN @getbookcode
                                FETCH NEXT
                                    FROM @getbookcode INTO @Tbookcode,@TbookQty,@TbookRate
                                        WHILE @@FETCH_STATUS = 0
                                        BEGIN
                                             if exists(select BookCode from #Result where BookCode = @Tbookcode and BookRate = @TbookRate)
                                                begin
                                                    EXEC('Update #Result set [' + @billno+']= '+@TbookQty+' where BookCode = '''+@Tbookcode+''' and  BookRate = '+@TbookRate+'')                 
                                                end                          
                                             else 
                                                begin
                                                    EXEC('Insert Into #Result ([' + @bno + '],BookCode,BookRate) values ( '+@TbookQty +' , '''+@Tbookcode+''','+@TbookRate+')')                                  
                                                end              
                                            FETCH NEXT FROM @getbookcode INTO @Tbookcode,@TbookQty , @TbookRate
                                        END
                                    CLOSE @getbookcode
                                    DEALLOCATE @getbookcode                              
                    FETCH NEXT FROM @Ordnum INTO @bno
                 END
                CLOSE @Ordnum
            DEALLOCATE @Ordnum

 select * from #Result

ここで #bill は、Billnum が格納される一時テーブルです。

于 2013-02-22T08:03:56.873 に答える
0

MERGEステートメントを使用します。これは、一致に基づいて INSERT または UPDATE を実行します。

必要なPIVOTを含むこのようなもの

MERGE INTO result R
USING (
        SELECT
              ISNULL(O1.BookCode, O2.BookCode) AS BookCode,
              ISNULL(O1.Quantity, 0) AS A1,
              ISNULL(O2.Quantity, 0) AS A2
        FROM
              (SELECT * FROM #ORDER WHERE BillNo = 'A1') O1
              FULL OUTER JOIN
              (SELECT * FROM #ORDER WHERE BillNo = 'A2') O2
                                 ON O1.BookCode = O2.BookCode
    ) src ON R.BookCode = src.BookCode
WHEN MATCHED THEN 
    UPDATE
    SET A1 = src.A1, A2 = src.A2
WHEN NOT MATCHED BY TARGET THEN
   INSERT (BookCode, A1, A2)
   VALUES (src.BookCode, src.A1, src.A2);
于 2013-02-22T07:39:56.550 に答える