2009-07-15 3 views
0

以下にリストされているテーブル構造を持つ問題の解決方法が必要です。 入力隣接する行を1つの行に結合するSQLクエリのヘルプが必要

1 2009年1月1日製品1
2 2009年2月2日Product2
3 2009年3月3日Product3
4 2009年4月4日Product4
5 2009年5月5日Product5

出力

1 2009年1月1日2009分の2製品1
2 2009年3月3日2009年4月4日Product3
3 2009年5月5日                  Product5

私は、CTEを使用してみました。しかし、2番目の行の値を抽出することはあまり成功していませんでした。 助けてください。ありがとう。

+1

返されるセットにはいくつの列がありますか?また、行3では、2番目の日付の列がありません - それはnull値、空の文字列、または何ですか? –

+0

返されるセットには4つの列が含まれます。 3行目では、日付の値を結合するための一致する行がないため、2番目の日付の列はNULLになります。 – Techspirit

答えて

1

Russの回答がまったく役に立たないかどうかわかりません。 Here is a linkには、クエリの結果に行番号を追加する方法が記載されています。 (最も可能性の高い例を見つけるために「行番号」を検索してください)

行に適切な番号を付けるクエリを作成したら、その行をCTEにスローしてから奇数、偶数の場合は再び。それぞれの結果に偶数番号の値を返します(奇数-1 =偶数)。その時点で、クエリの結果を結合して、1つの行に2つのプロダクトを得ることができます。

+1

私は最初の列として生成された行番号と共にCTEを使用するクエリを持っています。私は入力テーブルのどの列もグループ化できません。 %2演算子を使用した場合、クエリは偶数行だけを返しました。 – Techspirit

+0

何が間違っているかを確認するには、クエリを参照する必要があります。これをコメントに入れるのは大変だと思います。比較のためには、(x%2 = 0)と(x%2 = 1)が必要です。 –

+0

アイデアをありがとう、ジョン。ProdListCTEでROW_IDとしてオーバー \t( \t選択 \t \t ROW_NUMBER()(ProdTimeのASCによって順)、 \t \t ProdTime、 \t \t DESC、 \t \tなどから、これは私が に取り組んできたクエリです \t) \tをProdListStaged \tを選択します(ProdListにProdTime1、ProdTime2、DESC) \t \tを挿入\t A.ProdTime、 \t \t \t B.ProdTime、 \t \t \t A.Desc、 から\t \t \t \t \t ProdListCTE Aが= B.row_id A.row_idで \t \t \t ProdListCTE Bに参加 - 1 – Techspirit

1

あなたはPIVOTを探しています:http://msdn.microsoft.com/en-us/library/ms177410.aspx
ここにあなたが与えた情報のベストショットです、私は私のアプリの中で似たようなことをしています。ピボット値が変更された場合は、動的SQLクエリを使用する必要があります。

SELECT * 
    FROM (SELECT [Date] 
     ,[Product] 
     FROM [Values] 
    PIVOT (Max([Date]) 
      FOR [Product] 
      IN ('put date ranges here')) pvt 

これは私の見た目ですが、これはさまざまな値のセットを許可します。これはフォームビルダでユーザー入力の値を取得するために使用されます

--//Get a comma delimited list of field names from the field table for this form 
DECLARE @FieldNames varchar(max) 
SELECT @FieldNames = COALESCE(@FieldNames + ', ', '') + '[' + CAST([FieldName] AS varchar(max)) + ']' 
    FROM [Fields] 
WHERE [FormID] = @FormID 

--//create a dynamic sql pivot table that will bring our 
--//fields and values together to look like a real sql table 
DECLARE @SQL varchar(max) 
SET @SQL = 
'SELECT * 
    FROM (SELECT [Values].[RowID] 
      ,[Fields].[FieldName] 
      ,[Values].[Value] 
      FROM [Values] 
     INNER JOIN [Fields] ON [Fields].[FieldID] = [Values].[FieldID] 
      WHERE [Fields].[FormID] = ''' + @FormID + ''') p 
    PIVOT (Max([Value]) 
     FOR [FieldName] 
     IN (' + @FieldNames + ')) pvt' 

--//execute our sql to return the data 
EXEC(@SQL) 
+0

ポインタのおかげで、ラス。私はPIVOT演算子を使ってみよう。 – Techspirit

+0

私は最終的に私に半分の結果しか与えていないクエリが既にあったので、CTEと最終的に行く必要がありました。おかげさまで – Techspirit

関連する問題