2016-11-02 16 views
2

ここにどこにも行きません。とても簡単です。日付に基づくSQLのグループ化とカウント

テストデータは次のとおりです。たとえば12/09/2016を取る、私は後だすべては、活動的な患者の一日あたりのCOUNTある

SELECT c.SpellAdmissionDate, 
     c.SpellDischargeDate, 
     c.Pat_Code 
FROM [CommDB].[dbo].[vwCivicaSLAM1617Live] c 
WHERE c.Hrg_Code like 'VA%' 
    and c.Pat_Code like 'HEY%' 
ORDER BY c.SpellDischargeDate desc 

以下
declare @table table(SpellAdminsionDate datetime, SpellDischargeDate datetime, Pat_code varchar(10)) 
insert into @table (SpellAdminsionDate, SpellDischargeDate, Pat_code) values('2016-09-12 15:55:00:000','2016-09-19 20:20:00:000','HEY3052275') 
insert into @table(SpellAdminsionDate, SpellDischargeDate, Pat_code) values ('2016-09-07 17:17:00:000','2016-09-17 18:40:00:000','HEY0810155') 
insert into @table(SpellAdminsionDate, SpellDischargeDate, Pat_code) values ('2016-09-14 16:50:00:000','2016-09-17 18:01:00:000','HEY1059266') 
insert into @table(SpellAdminsionDate, SpellDischargeDate, Pat_code) values ('2016-09-15 02:47:00:000','2016-09-15 17:28:00:000','HEY0742883') 
insert into @table(SpellAdminsionDate, SpellDischargeDate, Pat_code) values ('2016-08-27 00:11:00:000','2016-09-14 12:49:00:000','HEY3050628') 
insert into @table(SpellAdminsionDate, SpellDischargeDate, Pat_code) values ('2016-09-10 12:24:00:000','2016-09-13 20:00:00:000','HEY0912392') 
insert into @table(SpellAdminsionDate, SpellDischargeDate, Pat_code) values ('2016-09-12 12:51:00:000','2016-09-13 19:55:00:000','HEY0908691') 

Select * from @table` 

は同じことを表示する私の簡単なコードですその日に結果は5(テストデータに基づく)となり、12日後の2カムとなります。

もっと簡単にできる場合は、DATE_REFERENCEと呼ばれる日付参照テーブルがあり、利用可能な日付がすべてあります。

+0

あなたの質問にそのDATE_REFERENCEテーブルを追加し、あなたの答えをかなり早く得るでしょう。 – Jens

答えて

0

1日に患者がいない可能性を考慮して、日付参照テーブルを患者情報のプライマリおよびレフトジョインとして使用したいとします。あなたはカラム名を特定しないので、私は[datecol]を使っただけです。

これ以上のものがあるかもしれないが、サンプルデータと期待される結果がないと、本当に必要なものを知ることが難しいと思われる。

nb。私はdate_referenceテーブルの日付が真夜中(00:00:00)になっているか、データタイプが日付(時/分などなし)であると仮定します。

+0

これは近いと思います100% – Simon

+0

Ding Dang Doこれはまさに私が探していたシンプルなソリューションで、どこかにここにいたことが分かっていたので、ありがとう。 – Simon

+0

素晴らしい。私は、解決策としてこれをチェックして、他の人が質問が答えられたことを知っていると推測します。 –

0

これは必要なものですか?

SELECT dr.date, 
     (SELECT COUNT(*) 
     FROM [CommDB].[dbo].[vwCivicaSLAM1617Live] c 
     WHERE dr.date between c.SpellAdmissionDate and c.SpellDischargeDate) as cnt_per_day 
FROM DATE_REFERENCE dr 

相関クエリに必要なフィルタを追加します。

0

あなたの日付の参照テーブルに参加し、

SELECT 
dateRef 
,COUNT(DISTINCT Pat_Code) AS PatCount 
FROM @table t 
RIGHT JOIN @date_reference 
ON SpellAdminsionDate <= dateRef 
AND SpellDischargeDate >= dateRef 
GROUP BY dateRef; 
-1

は、私はあなたはそれがすべての日の日付が含まれている場合は、クエリにDATE_REFERENCE表を持参する必要があると思う患者参照の明確でカウントすることによって、これを達成することができますあなたはそれらに基づいて患者をカウントする必要があるが、ここでは日付ごとの患者のみ

Select DISTINCT c.SpellAdmissionDate, count(c.Pat_code) as PCounter 
    From [CommDB].[dbo].[vwCivicaSLAM1617Live] c 
    GROUP BY c.SpellAdmissionDate 
    ORDER BY c.SpellAdmissionDate desc 
+0

このように 'select distinct'と' group by'を使うことは決してありません。グループは、明確に定義された行を生成して、 'distinct different'を完全に冗長にします。 –

0

アクティブカウントがここで提供一時データのために(することによって達成することができ、このテーブルを形成し、あなたが必要な結果を得ることができますかのサンプルであること)

SELECT DISTINCT CAST(T1.SPELLADMINSIONDATE AS DATE) 
    AdmissionDate,PATIENTS.TotalActive 
    FROM @TABLE T1 
    CROSS APPLY (SELECT COUNT(*)TotalActive FROM @TABLE T2 WHERE 
    CAST(T2.SPELLADMINSIONDATE AS DATE)<=CAST(T1.SPELLADMINSIONDATE AS DATE)) PATIENTS 
関連する問題