2017-05-02 1 views
0

私はデータベースへのアクセスのみを選択しました。このクエリは、1年全体の結果(1行)を取得します。ストアドプロシージャを使用せずに異なる日付範囲(別のテーブルから取得)に対してsqlでクエリを複数回実行するには?

SELECT 
    COUNT(U.ssnnoncumhrs) as [Non Cums Hrs] 
FROM 
    (SELECT TOP 100 PERCENT 
     (CASE 
      WHEN (([Social Security Number (SSN)] = LEAD([Social Security Number (SSN)], 1, 0) OVER (ORDER BY [Social Security Number (SSN)], sequencedate DESC, [YTD Productive Hours] DESC, [YTD Uncapped gross FUTA Wages] DESC)) 
        AND ([YTD Productive Hours] < LEAD([YTD Productive Hours], 1, 0) OVER (ORDER BY [Social Security Number (SSN)], sequencedate DESC, [YTD Productive Hours] DESC, [YTD Uncapped gross FUTA Wages] DESC))) 
       THEN [Social Security Number (SSN)] 
      END) as ssnnoncumhrs 
     FROM 
      dbo.staging P, dbo.tblBatch T 
     WHERE 
      P.BatchId = T.BatchId 
      AND P.FileId = T.FileId 
      AND sequencedate >= '1/1/2016' 
      AND sequencedate <='12/31/2016' 
     ORDER BY 
      [Social Security Number (SSN)], sequencedate DESC, 
      [YTD Productive Hours] DESC, [YTD Uncapped gross FUTA Wages] DESC) as U 

代わりに、このクエリを異なる日付範囲で実行する必要があります。

dbo.tblbatchには日付のリストがあります。このクエリーは、1番目と2番目の日付の間、2番目と3番目の日付の間など、リスト内のすべての日付をカバーするまで実行する必要があり、毎回fromとtoの日付を手動で変更したかのようにすべての結果を返します。このような

+3

働くだろう。 SSNは決してプレーンテキストに保存されるべきではありません...これまでの...期間。それらの列名はちょうどひどいです。スペースやその他の句読点は、列名やオブジェクト名には対応していません。また、ANSI-92スタイルの結合を使用する必要があります。これは25年以上前からあります。 http://sqlblog.com/blogs/aaron_bertrand/archive/2009/10/08/bad-habits-to-kick-using-old-style-joins.aspx –

+1

しかし、最大の問題は、それはまったく明らかではないということですあなたがここでやろうとしていること。これは始めるのに最適な場所です。 http://spaghettidba.com/2015/04/24/how-to-post-at-sql-question-on-a-public-forum/ –

+0

あなたは 'SP'を必要としないループを利用することができます。 – Joby

答えて

0

何かが多くの赤旗がここにあります

CREATE TABLE #Test 
(RowID INT IDENTITY(1,1), 
DateRange DATETIME 
) 

--Insert the date from date range table 
INSERT INTO #Test 
SELECT DISTINCT TOP 10 Inserted FROM Table1 

--Variables decleration 
DECLARE @MaxID INT 
DECLARE @MinID INT 
DECLARE @DATE DATETIME 

SET @MinID = 1 
SELECT @MaxID = MAX(RowID) FROM #Test 



WHILE @MaxID >= @MinID 
BEGIN 
    SELECT @DATE = DateRange FROM #Test WHERE RowID = @MinID 

    SELECT TOP 1 * FROM Table2 WHERE Inserted = @DATE 

    SET @MinID = @MinID + 1 
END 
+0

OPがこれらの結果をそれぞれ独自の結果セットに入れることを望んでいない限り、ここではループが最良のアプローチではないことを提案します。 –

関連する問題