SQL Server ストアド プロシージャを使用して、WPF データグリッドのデータ ソースとして使用するデータ テーブルを生成しています。データは親 [Sample] 子 [SampleConstituent] 関係の 2 つのテーブルにあり、PIVOT を使用して子テーブルのデータ レコードの列を生成しています。クエリはパラメーターを使用して、データグリッドに返されるレコードをフィルター処理できるようにします。
私の問題は、最新のレコードに基づいてクエリから TOP N の結果セットを返したいということです。次のストアド プロシージャがあり、データが常に最も古いレコードが最初に返されることを除いて、すべてが機能します。したがって、TOP N
フィルターは最新のレコードではなく、最も古いレコードを返します。Sample.SampleDateTime
並べ替えたい親テーブルの列です。
私は初心者の脳が結び目であるほど多くの反復を試みました!
ALTER PROCEDURE [dbo].[spSampleDisplayAllParams]
-- Add the parameters for the stored procedure here
@fromDate DATE = '2013-01-01',
@toDate DATE = '2100-01-01',
@ProductName NVARCHAR(50) = '%',
@SampleNumber NVARCHAR(50) = '%',
@numSamples NVARCHAR(50) = 200
AS
BEGIN
SET NOCOUNT ON;
DECLARE @cols AS NVARCHAR(MAX),
@query AS NVARCHAR(MAX)
select @cols = STUFF((SELECT distinct ',' + QUOTENAME(ConstituentName)
from SampleConstituent
FOR XML PATH(''), TYPE
).value('.', 'NVARCHAR(MAX)')
,1,1,'')
PRINT @cols
set @query
= 'SELECT top (' + @numSamples + ') * from
(SELECT TOP 100 PERCENT s.SampleID, s.SampleNumber, s.SampleDateTime, s.ProductName, sc.ConstituentName, sc.ConstituentValue
FROM dbo.Sample s INNER JOIN
dbo.SampleConstituent sc ON s.SampleID = sc.SampleID
WHERE (s.Active = 1) AND
(s.ProductName Like ''' + @ProductName + ''') AND
(s.SampleNumber Like ''' + @SampleNumber + ''') AND
(s.SampleDateTime BETWEEN ''' + CONVERT(nvarchar(24), @FromDate, 121) +''' AND'''+ CONVERT(nvarchar(24), @ToDate, 121) +''')
ORDER BY s.SampleDateTime ) x
pivot
(
max(ConstituentValue)
for ConstituentName in (' + @cols + ')
) p '
execute(@query)
END