使用SQL从多个表中获取计数(*)
我有两个表使用SQL从多个表中获取计数(*),sql,sql-server,Sql,Sql Server,我有两个表Registration\u Table和ApplicationStatus\u Table。为了便于理解,我仅从注册表中选取了一列。在应用程序状态表中,根据注册日期和最终提交日期检查状态 登记表 Registrationdate ----------------------- 2016-12-22 12:52:48.493 2016-12-21 15:05:24.533 应用程序状态表 FinalSubmissiondate InnovationS
Registration\u Table
和ApplicationStatus\u Table
。为了便于理解,我仅从注册表中选取了一列。在应用程序状态表中,根据注册日期和最终提交日期检查状态
登记表
Registrationdate
-----------------------
2016-12-22 12:52:48.493
2016-12-21 15:05:24.533
应用程序状态表
FinalSubmissiondate InnovationStatus
-------------------------------------------------
2016-12-22 12:52:48.493 Completed
2016-12-21 15:05:24.533 11
我需要的结果如下
Registrationdate RegistrationsCount InnovationsStatus
----------------------------------------------------------
2016-12-22 1 1
2016-12-21 1 0
我需要特定日期的结果多少注册和创新状态。如果InnovationStatus completed表示1和其他所有0。您可以执行如下操作:
SELECT CAST(r.Registrationdate AS DATE) AS as Registrationdate,
COUNT(Registrationdate) OVER (PARTITION BY Registrationdate) AS RegistrationsCount,
COUNT(CASE WHEN a.InnovationStatus='Completed' THEN 1 ELSE NULL END) as InnovationsStatus
FROM Registration_Table r
INNER JOIN ApplicationStatus_Table a
ON a.FinalSubmissiondate=r.Registrationdate
GROUP BY r.Registrationdate
ORDER BY r.Registrationdate DESC
create table #Registration_Table (
Registrationdate datetime
)
insert into #Registration_Table
values('2016-12-22 12:52:48.493'),('2016-12-21 15:05:24.533')
create table #ApplicationStatus_Table(
FinalSubmissiondate datetime,
InnovationStatus varchar(20)
)
insert into #ApplicationStatus_Table
values ('2016-12-22 12:52:48.493','Completed'),('2016-12-21 15:05:24.533','11')
SELECT CAST(r.Registrationdate AS DATE),
COUNT(Registrationdate) OVER (PARTITION BY Registrationdate) AS RegistrationsCount,
COUNT(CASE WHEN a.InnovationStatus='Completed' THEN 1 ELSE NULL END) as InnovationsStatus
FROM #Registration_Table r
INNER JOIN #ApplicationStatus_Table a
ON a.FinalSubmissiondate=r.Registrationdate
GROUP BY r.Registrationdate
ORDER BY r.Registrationdate DESC
Registrationdate RegistrationsCount InnovationsStatus
2016-12-22 1 1
2016-12-21 1 0
测试数据:
SELECT CAST(r.Registrationdate AS DATE) AS as Registrationdate,
COUNT(Registrationdate) OVER (PARTITION BY Registrationdate) AS RegistrationsCount,
COUNT(CASE WHEN a.InnovationStatus='Completed' THEN 1 ELSE NULL END) as InnovationsStatus
FROM Registration_Table r
INNER JOIN ApplicationStatus_Table a
ON a.FinalSubmissiondate=r.Registrationdate
GROUP BY r.Registrationdate
ORDER BY r.Registrationdate DESC
create table #Registration_Table (
Registrationdate datetime
)
insert into #Registration_Table
values('2016-12-22 12:52:48.493'),('2016-12-21 15:05:24.533')
create table #ApplicationStatus_Table(
FinalSubmissiondate datetime,
InnovationStatus varchar(20)
)
insert into #ApplicationStatus_Table
values ('2016-12-22 12:52:48.493','Completed'),('2016-12-21 15:05:24.533','11')
SELECT CAST(r.Registrationdate AS DATE),
COUNT(Registrationdate) OVER (PARTITION BY Registrationdate) AS RegistrationsCount,
COUNT(CASE WHEN a.InnovationStatus='Completed' THEN 1 ELSE NULL END) as InnovationsStatus
FROM #Registration_Table r
INNER JOIN #ApplicationStatus_Table a
ON a.FinalSubmissiondate=r.Registrationdate
GROUP BY r.Registrationdate
ORDER BY r.Registrationdate DESC
Registrationdate RegistrationsCount InnovationsStatus
2016-12-22 1 1
2016-12-21 1 0
结果:
SELECT CAST(r.Registrationdate AS DATE) AS as Registrationdate,
COUNT(Registrationdate) OVER (PARTITION BY Registrationdate) AS RegistrationsCount,
COUNT(CASE WHEN a.InnovationStatus='Completed' THEN 1 ELSE NULL END) as InnovationsStatus
FROM Registration_Table r
INNER JOIN ApplicationStatus_Table a
ON a.FinalSubmissiondate=r.Registrationdate
GROUP BY r.Registrationdate
ORDER BY r.Registrationdate DESC
create table #Registration_Table (
Registrationdate datetime
)
insert into #Registration_Table
values('2016-12-22 12:52:48.493'),('2016-12-21 15:05:24.533')
create table #ApplicationStatus_Table(
FinalSubmissiondate datetime,
InnovationStatus varchar(20)
)
insert into #ApplicationStatus_Table
values ('2016-12-22 12:52:48.493','Completed'),('2016-12-21 15:05:24.533','11')
SELECT CAST(r.Registrationdate AS DATE),
COUNT(Registrationdate) OVER (PARTITION BY Registrationdate) AS RegistrationsCount,
COUNT(CASE WHEN a.InnovationStatus='Completed' THEN 1 ELSE NULL END) as InnovationsStatus
FROM #Registration_Table r
INNER JOIN #ApplicationStatus_Table a
ON a.FinalSubmissiondate=r.Registrationdate
GROUP BY r.Registrationdate
ORDER BY r.Registrationdate DESC
Registrationdate RegistrationsCount InnovationsStatus
2016-12-22 1 1
2016-12-21 1 0
考虑具有完整计数和条件计数的聚合查询。下面还从条件聚合中返回为零的datetime值中提取时间部分:
SELECT CONVERT(date, r.Registrationdate) As [Date], Count(*) As RegistrationsCount,
SUM(CASE WHEN a.Status = 'Completed' THEN 1 ELSE 0 END) As InnovationsStatus
FROM Registration_Table r
INNER JOIN ApplicationStatus_Table a
ON r.Registrationdate = a.FinalSubmissiondate
GROUP BY CONVERT(date, r.Registrationdate)
您使用的是哪种数据库管理系统?博士后?Oracle?正如我在问题中提到的,使用sql server@问题是“使用SQL”-SQL是一种查询语言,而不是一种特定的DBMS产品哪一种?MySQL、MSSQL、postgres、oracle等?SQL是一种语言#rtfmI需要使用sql server 2008查询上述显示计数@没有名字的马获取错误:“Registrationdate”附近的语法不正确@吉宾Balachandran@MMK我已经更新了我的答案。如果您有任何问题,请检查并告知我。日期格式应为2016-12-22@吉宾Balachandran@MMK是的,只有当我们将datetime强制转换为date时,您才会得到这样的结果。@MMK也许您在某些记录中有一个空列。使用问题中给定的模式,尝试将计数(1)作为注册计数
@MMK,这应该可以工作+1从我这边。@MMK-请澄清,因为我不理解您的评论。FinalSubmissiondate有一些空日期,但我添加了count(1)作为RegistrationCount,然后也没有显示@Parfati添加了数据转换,然后在转换(日期,r.Registrationdate)=转换(日期,a.FinalSubmissiondate)时工作正常,但计数显示为荣,有2个注册仅显示6个区域Traiton计数日期注册计数创新状态2016-12-06 6