0

MS Access CrossTab クエリを T-SQL に変換して SQL2000 または Linq-to-SQL で実行する方法を理解するのに本当に苦労しています。私が持っているのは、Access で次のようなクエリです。

クロス集計クエリへのアクセス そしてこれを生成します: クロス集計クエリ結果へのアクセス

クエリは基本的に ItemID と StoreID でグループ化し、販売数量を合計しますが、Access の CrossTab クエリを使用すると、行ごとに一意の ItemID、StoreID ごとに列、および StoreID/ItemID の組み合わせごとに合計数量を取得できます。値として。

T-SQL 2000 でこれをどのように構築しますか? グループ化を使用して簡単な選択クエリを作成できますが、StoreID、ItemID、および Qty の 3 つの列にデータが表示されます。しかし、必要なのは、ItemID の列と、結果セット内のすべての StoreID の列です。

SELECT     Trans.TranSID as StoreID, TransDetail.TranItemID as ItemID, SUM(TransDetail.Qty) AS TotalQtyForStore
    FROM         Trans INNER JOIN
                          TransDetail ON Trans.TranID = TransDetail.TranID INNER JOIN
                          Item ON TransDetail.TranItemID = Item.ItemID
    WHERE     (Trans.TranDate > CONVERT(DATETIME, '2005-01-01 00:00:00', 102)) AND (Trans.TranTypeID = 'so' OR
                          Trans.TranTypeID = 'ca') AND (Trans.TranStatus <> 'v') AND (Item.ItemClassID = 'RHM')
    GROUP BY Trans.TranSID, TransDetail.TranItemID

これが生成されます:

ここに画像の説明を入力

しかし、実際に行う必要があるのは、上記の Access CrossTab クエリのように、StoreID 値が列になるようにこのデータを変換することです。

4

1 に答える 1

0

おそらく事前にすべてのストア(TranSID)値を知っているわけではないので、動的SQLを使用してこれを行います。このストアドプロシージャは、パラメータとして開始日/終了日を取り、クロスタブを生成します。おそらく、TranStatusやItemClassIDなど、他のいくつかのものもパラメーター化できますが、それらがクエリ内の固定要素なのか可変要素なのかは明確ではありませんでした。

CREATE PROCEDURE dbo.CrossTabByItem
  @StartDate DATETIME,
  @EndDate   DATETIME = NULL
AS
BEGIN
  SET NOCOUNT ON;

  SET @EndDate = COALESCE(DATEADD(DAY, 1, @EndDate), GETDATE());

  DECLARE @sql NVARCHAR(4000); SET @sql = N'';

  SELECT @sql = @sql + ',
    [' + TranSID + '] = SUM(CASE WHEN t.TranSID = ''' 
    + TranSID + ''' THEN td.Qty ELSE 0 END)' FROM 
    (
      SELECT DISTINCT TranSID FROM dbo.Trans
      WHERE TranDate >= @StartDate AND TranDate < @EndDate
    ) AS x ORDER BY TranSID;

    SET @sql = N'SELECT ItemID = td.TranItemID' + @sql + '
      FROM dbo.Trans AS t
      INNER JOIN dbo.TransDetail AS td
       ON t.TranID = td.TranID
      INNER JOIN dbo.Item AS i
       ON td.TranItemID = i.ItemID
      WHERE t.TranDate >= @StartDate
      AND t.TranDate < @EndDate
      AND t.TranTypeID IN (''so'',''ca'')
      AND t.TranStatus <> ''v''
      AND i.ItemClassID = ''RHM''
      GROUP BY td.TranItemID;';

    EXEC sp_executesql @sql, 
      N'@StartDate DATETIME, @EndDate DATETIME', 
      @StartDate, @EndDate;
END
GO

したがって、2005年1月1日から現在までのすべてを取得するには、次のように呼び出すことができます。

EXEC dbo.CrossTabByItem @StartDate = '20050101';

または、このように、2005年1月だけを取得するには:

EXEC dbo.CrossTabByItem @StartDate = '20050101', @EndDate = '20050131';
于 2012-07-21T16:23:53.260 に答える