2016-12-05 1 views
0

必要がある場合、私はデータを以下しているIDが1のIDが2の具体的な行日が同じで、すべての行の名前は、SQL Serverの2008R2に異なることと

Id  Date     Name  Cash 
1 11/25/2016 4:23.123  Ramesh 10000 
2 11/25/2016 4:23.173  Suresh 15000 
1 11/27/2016 5:23.320  Ramesh 30000 
2 11/27/2016 5:23.670  Suresh 40000 

と私は私ができるよう、ビューを作成したいです次の形式でデータを取得してください。

Id1 Date1    Name1 Cash1 Id2 Date2    Name2 Cash2 
1 11/25/2016 4:23.123 Ramesh 10000 2 11/25/2016 4:23.173 Suresh 15000 
1 11/27/2016 5:23.320 Ramesh 30000 2 11/27/2016 5:23.670 Suresh 40000 

どうすればいいですか?

+1

を合わない。たとえば、datetimeに基づいてrow_number()を作成し、次にrow_numberとrow_number + 1を結合するために自己結合を使用することができますが、レコードがペアになる方法はありますか? – Matt

+0

はあなたのデータに依存しますが、IDは1&2のみですか、3、4 ...などでしょうか? –

答えて

3

日付をやっているし、常に一日あたり2つのレコードが存在することになる場合は、時間をオフにドロップすると、自己を行うに変換することができ、ジョイン:

DECLARE @myRecords AS TABLE (Id INT, DATE DATETIME, Name VARCHAR(20), CASH INT) 

INSERT INTO @myRecords VALUES (1,'11/25/2016 4:23','Ramesh',10000),(2,'11/25/2016 4:23','Suresh',15000) 
,(1,'11/27/2016 5:23','Ramesh',30000),(2,'11/27/2016 4:23','Suresh',40000) 

SELECT 
    m1.Id as Id1 
    ,m1.Date as Date1 
    ,m1.Name as Name1 
    ,m1.Cash as Cash1 
    ,m2.Id as Id2 
    ,m2.Date as Date2 
    ,m2.Name as Name2 
    ,m2.Cash as Cash2 
FROM 
    @myRecords m1 
    LEFT JOIN @myRecords m2 
    ON CAST(m1.DATE AS DATE) = CAST(m2.DATE AS DATE) 
    AND m1.Id <> m2.Id 
WHERE 
    m1.Id = 1 

その後もへROW_NUMBER()を導入することができますあなたはその後、でもRowNumbersODD RowNumbersSELF JOINのすべてを取る好きな順序を見つけ出す:

;WITH cte AS (
    SELECT 
     * 
     ,RowNum = ROW_NUMBER() OVER (ORDER BY Date) 
    FROM 
     @myRecords 
) 

SELECT * 
FROM 
    cte c1 
    LEFT JOIN cte c2 
    ON c1.RowNum + 1 = c2.RowNum 
WHERE 
    c1.RowNum % 2 <> 0 
+0

ありがとうこれは私を助けます。 –

+0

@ SatyavanChoureあなたの歓迎して嬉しいです – Matt

+0

もう1つの課題、RowNumが偶数の場合の列名を変更したいRowNumが偶数の場合は別の列を作成しました。ですから、列名を異なるように変更したいと思います。 RowNum2、Id2、Date2、Name2、Cash2を含む。 –

0

あなたの論理が不明な場合は、この場合に役立ちますが、今後はIdフィルタまたは追加のID列とrow_number()を追加する必要があります。

SELECT 
    T.*, TT.* 
FROM 
    [Table] AS T 
     INNER JOIN 
    [Table] AS TT 
     ON T.Date = TT.Date 
0

必要な結果セットにはCross Applyを使用できます。

SELECT [ID], 
      [DATE], 
      [NAME], 
      [CASH], 
      B.* 
    FROM #TABLE1 A 
      CROSS APPLY (SELECT ID  AS ID2, 
           [DATE] AS DATE2, 
           [NAME] AS NAME2, 
           [CASH] AS CASH2 
         FROM #TABLE1 B 
         WHERE A.ID < B.ID 
           AND CONVERT(DATE, A.DATE) = CONVERT(DATE, B.DATE))B 
0

これも同じ結果を返します。これは、我々はあなたが名とIDがそうであるようにお互いに関連している行を決定する上でつもり方法を知っておく必要があるだろう、この権利を取得するが、いくつかの方法ドンすることができ

select a.id, a.date, a.name, a.cash, b.id as id2, b.date as date2, 
    b.name as name2, b.cash as cash2 
from myTable a 
inner join myTable b on a.id+1 = b.id 
    and cast(a.date as date) <> cast(b.date as date) 
関連する問題