2017-02-24 6 views
0

これは私の最初の選択です。SQL - 日付範囲を持つSUM列の方法

EMPLID DATE  TIMEIN GRACEPERIOD NUMBER_OF_LATE 
------ -------- ------ ----------- -------------- 
000001 1/1/2017 8:16  8:15      1 
000001 1/2/2017 8:25  8:15      1 
000001 1/3/2017 8:10  8:15      1 
000002 1/1/2017 8:30  8:15      1 
000002 1/2/2017 8:14  8:15      0 
000002 1/3/2017 8:23  8:15      1 

として名前を付け和の結果は次のようにする必要があります:

EMPLID DATE     NUMBER_OF_LATE 
------ -------------------  -------------- 
000001 1/1/2017 - 1/3/2017     3 
000002 1/1/2017 - 1/3/2017     2 

私はちょうどEMPLIDによってグループ化すると、日付の範囲に基づいて合計します。

+0

することにより、グループの後に条件を設定することができますEMPL_CTEからCONVERT(nvarchar(200)、[MINDATE])+ ' - ' + CONVERT(nvarchar(200)、[MAXDATE])、EMPLID、NO_OF_LATEを選択します。 –

+0

DBMSにタグを付けます。再使用! – jarlh

+0

どのDBMSを使用していますか? Postgres?オラクル? –

答えて

0

これは、使用しているDBMS内容に応じて、あなた

select EMPLID, min(DATE) + ' - ' + max(DATE), sum(NUMBER_OF_LATE) 
From t 
group by EMPLID 

のために働く必要があり、あなたが望む形式にあなたの日付を取得するための関数を使用する必要があります。

+0

これは、すべての従業員がWHERE句で全範囲をカバーするレコードを持つわけではないため、期待される結果を得られない可能性があります。 –

+0

@ティム - OPが望んでいることはあまり明確ではありません。 OPは必要なものをクリアする必要があります。 – GurV

+0

@ GurV次に、私は2つのダウンボントを取得している間、なぜ質問が_upvoted_されていますか? –

0

2つの異なる方法で私の答えを更新しました。あなたは(選択EMPLID、合計(NUMBER_OF_LATE)NO_OF_LATE、MIN([DATE])MinDateプロパティ、MAX([DATE])maxDateのAS EMPL_CTE(EMPLID、NO_OF_LATE、MinDateプロパティ、maxDateの)で

SELECT T1.EMPLID, MIN(CONVERT(DATETIME, T1.Date)) + ' ' + MAX(CONVERT(DATETIME, T1.Date)) AS DATARANGE, 
    SUM(NUmberOfLate) AS NUMBER_OF_LATE 
    FROM 
     (SELECT * 
     FROM AAA 
     WHERE Date BETWEEN CONVERT(datetime, '1/1/2017') AND CONVERT(datetime, '1/3/2018') 
     ) T1 
GROUP BY T1.EMPLID 


SELECT EMPLID, 
      MIN(CONVERT(DATETIME, Date)) + ' ' + MAX(CONVERT(DATETIME, Date)) AS DATARANGE, 
      SUM(NUmberOfLate) AS NOF 
     FROM AAA 
    GROUP BY EMPLID 
+0

グループの後に条件を入れないでください –

+0

dbmsが指定されていない質問に対する製品固有の回答。少なくとも、これがどのdbmsであるかをお知らせください。 – jarlh

関連する問題