2016-09-27 4 views
0

計算結果があるdiseaseScoresというテーブルがあります。 1時間ごとにランニングスコアが計算されます(currentScore)。このクエリの目的は、毎日のスコアをグループ化して(obsDate)、実行スコアが高いとみなされるnumberOfhoursをカウントすることです。高値は16(currentScore > 16)より大きい。これまでSQLクエリのカウントは1日ごとに発生しますが、逃した日も入力します

私のクエリは次のとおりです。

SELECT 
    DATEADD(DAY, 0, DATEDIFF(day, 0, obsDate)) AS obsDate, 
    (CASE 
     WHEN count(id) > 12 THEN count(id) 
     ELSE 0 
    END) numOfHoursAtHigh 
FROM 
    diseaseScores 
WHERE 
    diseaseID = 2 
    AND siteID = 72160 
    AND numOfRotationYears = 3 
    AND currentScore > 16 
    AND month(obsDate) IN (6) 
GROUP BY 
    DATEADD(DAY, 0, DATEDIFF(day, 0, obsDate)) 
ORDER BY 
    DATEADD(DAY, 0, DATEDIFF(day, 0, obsDate)); 

問い合わせは、月の13日間の結果を返します。私はギャップを埋めるので、毎月の記録を持っています。ギャップはnumOfHoursAtHighの結果が必要です。

どうすればいいですか?これは、SQL Server 2008の+

のために返される結果セットがあるさ:

 2016-06-04 00:00:00.000  0 
     2016-06-05 00:00:00.000  23 
     2016-06-06 00:00:00.000  23 
     2016-06-07 00:00:00.000  23 
     2016-06-08 00:00:00.000  3 
     2016-06-09 00:00:00.000  23 
     2016-06-10 00:00:00.000  0 
     2016-06-17 00:00:00.000  13 
     2016-06-18 00:00:00.000  23 
     2016-06-19 00:00:00.000  0 
     2016-06-20 00:00:00.000  14 
     2016-06-21 00:00:00.000  23 
     2016-06-22 00:00:00.000  16 

UPDATE:だから私は今、私を満たしていたこれを持っている(特定の日まで倍増された)knobcreekmansアプローチの修正版を使用してギャップと1ヶ月間素晴らしい作品。私が月(obsDate)IN(6)を月(obsDate)IN(6,7)に変更することで2ヶ月分の価値を求めるとすぐに、6,7ヶ月に衝突する日がスキップされます。

 SELECT CAST(obsDate AS DATE) as obsDate, 
      (CASE 
       WHEN COUNT(id) > 12 THEN COUNT(id) 
       ELSE 0 
       END) numOfHoursAtHigh 
     FROM diseaseScores 
     WHERE diseaseID=2 
      AND siteID=72160 
      AND numOfRotationYears=3 
      AND currentScore > 16 
      AND month(obsDate) IN (6) 
      GROUP BY CAST(obsDate AS DATE) 
     UNION 
     SELECT CAST(obsDate AS DATE) AS obsDate, 
      0 AS numOfHoursAtHigh 
     FROM diseaseScores 
     WHERE diseaseID=2 
      AND siteID=72160 
      AND numOfRotationYears=3 
      AND currentScore <= 17  
      AND month(obsDate) IN (6) 
      and day(obsDate) NOT IN  --<-- added from here 
      (
     SELECT distinct day(obsDate) 
     FROM diseaseScores 
     WHERE diseaseID=2 
      AND siteID=72160 
      AND numOfRotationYears=3 
      AND currentScore > 16 
      AND month(obsDate) IN (6) 
      )       --<-- to here to omit the duplicates 
     GROUP BY CAST(obsDate AS DATE) 
     ORDER BY CAST(obsDate AS DATE) 

期待される結果を中心に質問に答える。列に与える月(または月)の各日の1つのレコード。あなたは、元と同じである別のSELECTを作成することができnumOfHoursAtHigh例えば

 2016-06-01 0 
     2016-06-02 0 
     2016-06-03 0 
     2016-06-04 0 
     2016-06-05 23 
     2016-06-06 23 
     2016-06-07 23 
     2016-06-08 23 
     2016-06-09 23 
     2016-06-10 0 
     2016-06-11 0 
     2016-06-12 0 
     2016-06-13 0 
     2016-06-14 0 
     2016-06-15 0 
     2016-06-16 0 
     2016-06-17 13 
     2016-06-18 23 
     2016-06-19 0 
     2016-06-20 14 
     2016-06-21 23 
     2016-06-22 16 
     2016-06-23 0 
     2016-06-24 0 
     2016-06-25 0 
     2016-06-26 0 
     2016-06-27 0 
     2016-06-28 0 
     2016-06-29 0 
     2016-06-30 0 
+0

あなたが期待される結果がYes非常に素晴らしい、私はこれが好き – TheGameiswar

答えて

0

の日付と、整数は、その後、あなたが望む結果(currentScore > 16を)フィルタリングされたあなたのWHERE句の一部を変更し、 UNIONをまとめてください。

SELECT CAST(obsDate AS DATE) as obsDate, 
    (CASE 
     WHEN COUNT(id) > 12 THEN COUNT(id) 
     ELSE 0 
     END) numOfHoursAtHigh 
FROM diseaseScores 
WHERE diseaseID=2 
    AND siteID=72160 
    AND numOfRotationYears=3 
    AND currentScore > 16 
    AND month(obsDate) IN (6) 
    GROUP BY CAST(obsDate AS DATE) 
UNION 
SELECT CAST(obsDate AS DATE) AS obsDate, 
    0 AS numOfHoursAtHigh 
FROM diseaseScores 
WHERE diseaseID=2 
    AND siteID=72160 
    AND numOfRotationYears=3 
    AND currentScore < 17  --<-- note the change 
    AND month(obsDate) IN (6) 
GROUP BY CAST(obsDate AS DATE) 
ORDER BY CAST(obsDate AS DATE) 
+0

を設定し表示することができます。完璧に動作します。何らかの理由で、2016年から1617年の2つの記録を示しています。 1つは0で間違っており、1つは13で正しい。それも2016年6月20日と2016年6月22日にこれを行っている。なぜATMを理解しようとしています – Mat41

0


こんにちは、
あなたは以下のクエリを持つことができ、

SELECT DS.dateadd(DAY,0, datediff(day,0, obsDate)) as obsDate, 
CASE 
WHEN DS1.COUNT(id) > 12 THEN COUNT(id) 
ELSE 0 
END AS numOfHoursAtHigh 
    FROM diseaseScores DS 
    INNER JOIN (
SELECT dateadd(DAY,0, datediff(day,0, obsDate)) AS date, COUNT(id) 
FROM diseaseScores GROUP BY date 
) DS1 
ON DS.date = DS1.obsDate 
AND DS.diseaseID=2 
AND DS.siteID=721DS.60 
AND DS.numOfRotationYears=3 
AND DS.currentScore > 16 
AND DS.month(obsDate) IN (6) 
ORDER BY DS.obsDate; 
+0

こんにちはジムはあなたの時間と労力に感謝します。私はちょうどそれが働くことができるかどうか見てこのクエリのいくつかの問題を介して作業中です – Mat41

+0

確かに。ありがとうございます –

+0

私は私のために働くためにこれを得ることができなかった申し訳ありませんジム – Mat41

関連する問題