2017-08-16 15 views
0

1つのテーブルからレコードを選択しようとしています。私はレコードを表示する2つの列を持っています。SQL Serverのレコード数に基づいてレコードを2列に分割します

私はカウントに基づいてレコードを分割する必要があります。つまり、各セクションごとにレコードを20行に分ける必要があります。

また、私は40件の以上のレコードを持っている場合には、それが列内のレコードを表示する必要があります。1.

添付のスクリーンショットをご参照ください:

enter image description here

レコードのようにする必要がありますがこの:私は保存されたpに以下のクエリを試してみました

enter image description here

私は何かが欠けているように見える。レコード数が40より大きい場合、期待どおりに検索されません。

本当にありがとうございます。

CREATE proc mytest2 
AS 
    IF OBJECT_ID('tempdb..#test1') IS NOT NULL 
     DROP TABLE #test1 

    IF OBJECT_ID('tempdb..#test2') IS NOT NULL 
     DROP TABLE #test2 

    SELECT 
     ROW_NUMBER() OVER (ORDER BY rno) 'rno', 
     Reg, SerialNo 
    INTO 
     #test1 
    FROM 
     (SELECT 
      ROW_NUMBER() OVER (ORDER BY ID) 'rno', 
      Reg, SerialNo 
     FROM 
      tRe) AS c 
    WHERE 
     rno % 20 = 0 

    SELECT 
     ROW_NUMBER() OVER (ORDER BY rno) 'rno1',    
     Reg AS Reg1, SerialNo AS SerialNo1 
    INTO 
     #test2 
    FROM 
     (SELECT 
      ROW_NUMBER() OVER (ORDER BY ID) 'rno', 
      Reg, SerialNo 
     FROM 
      tRe) AS c 
    WHERE 
     rno % 20 <> 1 

    SELECT * 
    FROM #test1 a 
    FULL OUTER JOIN #test2 b ON a.rno = b.rno1 

    ------ 


EXEC mytest2 
+0

こんにちは、あなたのページのために偶然にを作成し、あなたのために多くをありがとう – OzLa

答えて

1
は変更

あなたのWHERE条件に: 最初のクエリの場合:

WHERE (rno % 20 > 0 AND (rno/20) % 2 = 0) OR  (rno % 20 = 0 AND (rno/20) % 2 = 1) 

2番目のクエリの場合:言うことです

WHERE (rno % 20 > 0 AND (rno/20) % 2 = 1) OR (rno % 20 = 0 AND (rno/20) % 2 = 0) 

は、クエリは次のようになります。

IF OBJECT_ID('tempdb..#test1') IS NOT NULL 
    DROP TABLE #test1 

IF OBJECT_ID('tempdb..#test2') IS NOT NULL 
    DROP TABLE #test2 

SELECT ROW_NUMBER() OVER (ORDER BY rno) 'rno' , 
     Reg , 
     SerialNo 
INTO #test1 
FROM (SELECT ROW_NUMBER() OVER (ORDER BY EmployeeId) 'rno' , 
        Reg , 
        SerialNo 
      FROM  tRe 
     ) AS c 
WHERE (rno % 20 > 0 
      AND (rno/20) % 2 = 0 
     ) 
     OR (rno % 20 = 0 
      AND (rno/20) % 2 = 1 
      ) 

SELECT ROW_NUMBER() OVER (ORDER BY rno) 'rno1' , 
     Reg AS Reg1 , 
     SerialNo AS SerialNo1 
INTO #test2 
FROM (SELECT ROW_NUMBER() OVER (ORDER BY EmployeeId) 'rno' , 
        Reg , 
        SerialNo 
      FROM  tRe 
     ) AS c 
WHERE (rno % 20 > 0 
      AND (rno/20) % 2 = 1 
     ) 
     OR (rno % 20 = 0 
      AND (rno/20) % 2 = 0 
      ) 

SELECT * 
FROM #test1 a 
     FULL OUTER JOIN #test2 b ON a.rno = b.rno1 
+0

それを構築します。それは期待どおりに機能しています。 :) –

0

ここにはたくさんのことがあります同じことを達成するためにimplerコード(あなたは、行番号付け機能でCTEを作成し、二回それを参照することができ、一時テーブルを使用する必要はありません):

WITH 
    CTE AS (
     SELECT 
      Reg, SerialNo, 
      rn = (ROW_NUMBER() OVER (ORDER BY Reg) - 1)/20 + 1, 
      rn2 = (ROW_NUMBER() OVER (ORDER BY Reg)) % 20 
     FROM 
      [tRe] 
    ) 

SELECT 
    a.Reg, a.SerialNo, b.Reg, b.SerialNo 
FROM 
    CTE a 
LEFT OUTER JOIN 
    CTE b ON a.rn2=b.rn2 AND a.rn=b.rn-1 
WHERE 
    a.rn % 2 = 1 
関連する問題