1

table1私は2つの列toypatternを持つテーブル( )を持っていますadditionalcolor

表1

toypattern  additionalcolor
FL38        orange
FL38        yellow
LF66        grey
LF66        black

toypattern次に、列、1st color列、および列を表示するクエリを作成する必要があり2nd colorます。最大 5 つの additionalColor オプションを表示する必要があります

望ましい出力:

toypattern  1st color   2nd color     3rd color   4th color   5th color
  FL38        orange      yellow
  LF66        grey        black

このような SQL クエリを作成するにはどうすればよいですか?

4

4 に答える 4

2

Ok。この質問がこの質問に関連しているかどうかわからない(http://stackoverflow.com/questions/11070509/sql-query-issue-on-left-join):

しかし、これがあなたが求めているものかもしれない解決策です-03Usrのコードのいくつかを取りました(特にrow_numberと追加されたピボット):

;with cte as
(select toypattern, additionalcolor,
  rowno =  row_number() over(partition by toypattern order by additionalcolor)
from Table1)
SELECT
  ToyPattern
  --, ToyName
  , 'color 1' = [1]
  , 'color 2' = [2]
  , 'color 3' = [3]
  , 'color 4' = [4]
  , 'color 5' = [5]
FROM (  
  SELECT
  ToyPattern
  --, ToyName
  , rowno
  , additionalcolor
  FROM
    cte
) AS tac PIVOT (
  MAX (additionalcolor) FOR rowno in ([1],[2],[3],[4],[5])
) AS PivotTable
于 2012-06-17T11:17:24.507 に答える
2

これらを試してください:

;with cte as
(select toypattern, additionalcolor,
  row_number() over(partition by toypattern order by additionalcolor) As rn
from Table1)
select toypattern, 
  max(case when rn = 1 then additionalcolor end) as additionalcolor1,
  max(case when rn = 2 then additionalcolor end) as additionalcolor2
from cte
group by toypattern

これは次を返します:

toypattern  additionalcolor1    additionalcolor2
FL38        Orange              Yellow
LF66        Black               Grey

これの欠点は、新しい追加の色のために新しいMAX(...)行を追加する必要があることです。

////

別の解決策は、追加の色をCSVとして取得することです。

SELECT DISTINCT T1.toypattern,
STUFF((SELECT TOP 100 PERCENT ',' + s2.additionalcolor FROM Table1 AS s2 WHERE s2.toypattern = T1.toypattern ORDER BY ',' + s2.additionalcolor FOR XML PATH('')), 1, 1, '') AS Colours
FROM Table1 AS T1
ORDER BY T1.toypattern

これは次を返します:

toypattern  Colours
FL38    Orange,Yellow
LF66    Black,Grey

お役に立てれば。

于 2012-06-17T10:33:22.237 に答える
0
SELECT 
   first.toypattern,
   first.additionalColor,
   second.additionalColor
FROM
   Table1 first
   INNER JOIN Table2 second ON first.toypattern = second.toypattern
WHERE
   first.additionalColor < second.additionalColor

問題は、パターンごとに 2 つ以上の色がある場合、いくつかの一致が返されることです。

編集: これは、2 つ以上の色を検索するときに必要な結果を実際には返してくれません。ただし、この回答に添付されているコメントを考えると、削除しません。

于 2012-06-17T09:26:54.140 に答える
0

どの SQL Server バージョンを使用していますか? (コメントを追加できません)上記のようなピボットが最適ですが、古いバージョンの SQL Server(2000 など)を使用している場合は、CURSOR を使用してこれを行うことができます。

drop table #temp
create table #temp
(
   toypattern varchar(20),
   additionalcolor1 varchar(20),
   additionalcolor2 varchar(20),
   additionalcolor3 varchar(20),
   additionalcolor4 varchar(20),
   additionalcolor5 varchar(20)
)

declare @toypattern as varchar(20)
declare @additionalcolor as varchar(20)     
declare @Counter integer 
declare @StrSql varchar(200)    
declare @LastToyPattern as varchar(20)

set @LastToyPattern = ''

declare MyCursor cursor for  select toypattern, additionalcolor from table1 order by toypattern
open MyCursor
fetch next from MyCursor into @toypattern, @additionalcolor 

   while @@fetch_status = 0     
   begin
      if (@LastToyPattern <> @toypattern)
      begin
         if (@LastToyPattern <> '') 
         begin
            set @StrSql = @StrSql + replicate(',null', 5 - @Counter)    
            exec(@StrSql)
         end
         set @Counter = 0
         set @StrSql = 'insert into #temp select ''' + @toypattern + ''''
      end
      set @StrSql = @StrSql + ', ''' + @additionalcolor + ''''  
      set @Counter = @Counter + 1
      set @LastToyPattern = @toypattern
      fetch next from MyCursor into @toypattern, @additionalcolor
   end
set @StrSql = @StrSql + replicate(',null', 5 - @Counter)
exec(@StrSql)
close MyCursor
deallocate MyCursor
select * from #temp
于 2012-06-17T11:51:21.717 に答える