0

これは単純なクエリだと思いますが、しばらく困惑していました。2 つのテーブルを結合し、グループごとに特定のレコードのみを返す必要があります。

私が扱っているテーブルは次のとおりです。

CREATE TABLE [dbo].[FileData](
    [ID] [int] IDENTITY(1,1) NOT NULL,
    [FinDataID] [int] NULL,
    [PharmacyID] [int] NULL,
    [FileName] [nvarchar](150) NULL,
    [FileExtension] [nvarchar](15) NULL,
    [Data] [varbinary](max) NULL,
    [CreateDate] [datetime] NULL,
    [CreatedByID] [int] NULL,
    [UpdateDate] [datetime] NULL,
    [UpdatedByID] [int] NULL

CREATE TABLE [dbo].[FinData](
    [ID] [int] IDENTITY(1,1) NOT NULL,
    [PharmacyID] [int] NULL,
    [PeriodStart] [date] NULL,
    [PeriodEnd] [date] NULL,
    [SalesTotal] [money] NULL,
    [SalesDisp] [money] NULL,
    [SalesRetail] [money] NULL,
    [GPTotal] [decimal](12, 2) NULL,
    [GPRetail] [decimal](12, 2) NULL,
    [GPDisp] [decimal](12, 2) NULL,
    [Advertising] [money] NULL,
    [Rent] [money] NULL,
    [GrossWages] [money] NULL,
    [Depreciation] [money] NULL,
    [InterestExp] [money] NULL,
    [AllOtherExp] [money] NULL,
    [OwnerHours] [money] NULL,
    [CreateDate] [datetime] NULL,
    [CreatedByID] [int] NULL,
    [UpdateDate] [datetime] NULL,
    [UpdatedById] [int] NULL

これらのテーブルには、次のサンプル データが含まれていました。

FileData:
ID   FinDataID  PharmacyID yadayada
6    13         1
7    13         1
8    13         1
9    13         1
10   15         2
12   13         1
13   13         1

FinData: (where Pharmacy = 1)
ID  PharmacyID  PeriodStart
1   1           2012-07-01
13  1           2011-07-01 

これは、私が最初に使用していたサンプル クエリです。

SELECT
 FD.ID, FinData.ID AS FinDataID, FD.PharmacyID, FinData.PeriodStart, FinData.PeriodEnd, FileName, FileExtension, ISNULL(DATA,0) AS Data, FD.CreateDate, FD.CreatedByID, FD.UpdateDate, FD.UpdatedById
FROM FinData
LEFT JOIN FileData FD ON FD.FinDataID = FinData.ID
WHERE FinData.PharmacyID = @PharmacyID
ORDER BY PeriodStart desc, ID DESC

次のデータが返されました。

ID   FinDataID   PharmacyID   PeriodStart   yadayadayada
NULL 1           NULL         2012-07-01   
13   13          1            2011-07-01
12   13          1            2011-07-01
9    13          1            2011-07-01
8    13          1            2011-07-01
7    13          1            2011-07-01
6    13          1            2011-07-01

基本的に、その結​​果の各 FinDataID のトップ レコードが必要です...近いことはわかっていますが、まだ解決策を見つけていません! 前もって感謝します!

4

1 に答える 1

1
;WITH Data as
(
  SELECT
     FD.ID, FinData.ID AS FinDataID, FD.PharmacyID, FinData.PeriodStart, FinData.PeriodEnd, FileName, FileExtension, ISNULL(DATA,0) AS Data, FD.CreateDate, FD.CreatedByID, FD.UpdateDate, FD.UpdatedById
   , ROW_NUMBER() OVER (PARTITION BY [FinDataID]
                      ORDER BY [PeriodStart] DESC, [ID] DESC) as [Rank]
  FROM FinData
  LEFT JOIN FileData FD ON FD.FinDataID = FinData.ID
  WHERE FinData.PharmacyID = @PharmacyID
)
SELECT *
FROM [Data]
WHERE [Rank] = 1

結果セットには [Rank] 列も含まれることに注意してください。

于 2013-10-17T00:57:16.053 に答える