2016-07-29 6 views
0

私はMS Accessを多用していますが、最近はSQL  サーバーデータベースを手助けするように求められました。 AccessからサーバーデータベースにSQLコードをコピーするだけでは機能しないことに気付きました。誰かが私のSQLコードの機能をSQLの サーバに複製する手助けをしてもらえますか?以下は Microsoft SQL Serverで使用するAccessでパーティション機能を変換する方法はありますか。

はアクセス内で動作するSQLビューである:表1 FROM

SELECT [LV1]-[LV2] AS Aging, Partition([Aging],1,100,10) AS AgingRange 

Agingは、テーブル内の2つの列に基づいて計算された列です。以下に示すように、SQL Serverを使用してパーティションを分割します。

This link is a Datasheet View of my Query

+2

私たちはコード翻訳サービスではありません。あなたは変換を行い、私たちは(おそらく)その断片を手に入れようとします。 –

+1

私はあなた自身のストアドプロシージャを構築する必要があると思います - 私が知っている同等のT-SQL関数はありません。 – dbmitch

+0

_Partition_はAccessスペシャルです。 – Gustav

答えて

1

以下のT-SQLのスカラー値関数に動作するようです:

-- ============================================= 
-- Author:  Gord Thompson 
-- Create date: 2016-07-30 
-- Description: like Partition function in Access 
-- ============================================= 
CREATE FUNCTION [dbo].[myPartition] 
(
    @Number int, @Start int, @Stop int, @Interval int 
) 
RETURNS varchar(max) 
AS 
BEGIN 

    DECLARE @Result varchar(max), @x int, @y int; 

    IF @Number is null OR @Start is null OR @Stop is null OR @Interval is null 
      OR @Interval < 1 OR (@Stop - @Start) < 2 
    BEGIN 
     SELECT @Result = null; 
    END 
    ELSE 
    BEGIN 
     IF @Number < @Start 
     BEGIN 
      SELECT @Result = ':' + CONVERT(varchar(max), @Start -1); 
     END 
     ELSE 
     BEGIN 
      IF @Number > @Stop 
      BEGIN 
       SELECT @Result = CONVERT(varchar(max), @Stop + 1) + ':'; 
      END 
      ELSE 
      BEGIN 
       SELECT @x = @Start, @y = @Start + @Interval - 1 
       WHILE NOT (@Number >= @x AND @Number <= @y) 
       BEGIN 
        SELECT @x = @x + @Interval, @y = @y + @Interval; 
        IF @y > @Stop 
        BEGIN 
         SELECT @y = @Stop; 
        END 
       END 
       SELECT @Result = CONVERT(varchar(max), @x) + ':' + CONVERT(varchar(max), @y); 
      END 
     END 
    END 
    RETURN @Result 

END 

GO 
0

私はあなたがパーティション内で集約されていることを前提とし、それはの印であるとして、その後無視してくださいされていない場合私の無知なアクセスはパーティション機能を呼び出す。

私は、一時テーブルを作成して、右または左のパーティションのセットを定義します。次に、INNER JOINテーブルのデータBETWEEN低および高範囲。これは、Agingが集約関数である場合にのみ機能します。

DECLARE @DataPartitions TABLE(Low INT,High INT) 

INSERT @DataPartitions SELECT 0,10 
INSERT @DataPartitions SELECT 11,20 
INSERT @DataPartitions SELECT 21,30 
INSERT @DataPartitions SELECT 31,40 
INSERT @DataPartitions SELECT 41,50 

SELECT 
    Aging=AVG(T.Value1)-AVG(T.Value2), 
    CAST(MIN(P.Low) AS NVARCHAR(10))+":"+CAST(MAX(P.High) AS NVARCHAR(10)) 
FROM 
    MyTable T 
    INNER JOIN @DataPartitions P ON T.Value BETWEEN P.Low AND P.High 
GROUP BY 
    P.High 
0

ほとんどの動作がpartitionドキュメントから重複しています。負の数を含む範囲を処理しようとはしませんでしたが、余分な空白文字をマイナス記号やパディングに使用するかどうかはわからないため、かなり簡潔な表現です。そして、私はそれを仮定しているので、stopは厳密にstartより大きくなければならないので、負であってはならないので、ゼロの対数を取ることを避ける必要はありませんでした。私の下のバージョンでは、対数が作用する場所が適切に長さに適応します。

partitionはSQL Serverの予約語なので、おそらく名前を変更する必要があります。すべての値は整数であり、除算は破棄されるため除算操作が使用されることに注意してください。

create function dbo.[partition] as (
    @number int, @start int, @stop int, @interval int 
) 
returns varchar(32) as begin 
return 
    case 
     when @number < @start then ' :' + cast(@start - 1 as varchar(10)) + ' ' 
     when @number > @stop then ' ' + cast(@stop + 1 as varchar(10)) + ': ' 
     else 
     right(
      '   ' + cast(
       @start + (@number - @start)/@interval * @interval as varchar(10) 
      ), 
      floor(log(@stop)/log(10)) + 2 
     ) + ':' + 
     right(
      '   ' + cast( 
       case 
        when @start + ((@number - @start)/@interval + 1) * @interval > @stop 
        then @stop 
        else @start + ((@number - @start)/@interval + 1) * @interval 
       end as varchar(10) 
      ), 
      floor(log(@stop)/log(10)) + 2 
     ) 
    end 
end 

あなたはちょうど私がちょうど(@number - @start)/@intervalを使用することを主張するかもしれないグループ化駆動するためにpartition機能を必要とする場合(必要に応じて、「最初の前」と範囲「最後の後に」処理するcase式で。)

関連する問題