关于 groupby 原因的 Sql Query 问题和错误
Posted
技术标签:
【中文标题】关于 groupby 原因的 Sql Query 问题和错误【英文标题】:Sql Query issue and error regarding groupby cause 【发布时间】:2019-08-01 15:09:15 【问题描述】:我正在尝试计算每年的项目总数。以及有多少项目处于活动状态,有多少项目被取消。
我尝试按项目日期的原因分组,所以我们每年都有项目总数,但我不确定从哪里开始以及做什么
Select ts.Id as projectid ,
--a.ParentObjectId,
ts.RequestName as ProjectDates,
ts.Type,
ts.Category,
ts.SubType,
ts.status as projectstatus,
Count (ts.ReceptionDate),
cast (ts.ReceptionDate as Date) as ReceptionDate,
from [rpt].[TransmissionServicesRpt] ts
left join [dbo].[AuditHistory] a on a.ParentObjectId = ts.Id
Left join [dbo].[User] u on a.CreatedById = u.id
Group by ts.id, ts.ReceptionDate
+ -------------+--------+------------+------------+- ---------+------------------+
|新项目 |活跃 |取消 |终止 |不活跃 |发扬光大 |
+ -------------+--------+------------+------------+- ---------+------------------+
| 2013 | 32 | 45 | 4 | 11 | 30 |
| 2014 | 45 | 75 | 17 | 14 | 44 |
| 2015 | 46 | 90 | 25 | 21 | 44 |
| 2016 | 30 | 74 | 27 | 10 | 37 |
| 2017 | 82 | 119 | 11 | 26 | 82 |
| 2018 | 86 | 168 | 29 | 24 | 115 |
| 2019 | 23 | 138 | 9 | 4 | 125 |
+ -------------+--------+------------+------------+- ---------+------------------+
【问题讨论】:
查看您开始使用的数据会很有帮助。你如何定义活跃?取消?等等? 基于具有所需结果的表,您希望按 YEAR 列进行分组。然后使用conditional aggregation 获取其他每一列的总和。我会在答案中写一些 SQL,但我们需要更多地了解您的数据才能做到这一点。 ProjectId 状态日期 1589 有效 2018 年 8 月 29 日 1566 无效 2018 年 4 月 17 日 1042 取消 2014 年 1 月 6 日 1374 完成 2015 年 1 月 20 日 1543 完成 2014 年 8 月 4 日 1065 取消 7/ 15/2014 1397 完成 10/1/2012 1520 无效 4/13/2017 1420 完成 1/1/2015 1443 完成 1/1/2015 1048 取消 10/16/2014 1002 有效 2/6/2017 1357 完成 1/19 /2017 1606 活跃 11/6/2018 来自项目状态 我看不懂。在问题上使用edit link 并将其添加到问题的底部。使用<pre>
块对其进行格式化。
【参考方案1】:
您希望每年有一个结果行。所以按年分组。您可以通过YEAR
或DATEPART
获得它。然后有条件地计数:
select
year(receptiondate) as year,
count(*) as total,
count(case when status = 'Active' then 1 end) as active,
count(case when status = 'Cancelled' then 1 end) as cancelled,
count(case when status = 'Terminated' then 1 end) as terminated,
count(case when status = 'Inactive' then 1 end) as inactive,
count(case when status = 'Carried Forward' then 1 end) as carried_forward
from rpt.transmissionservicesrpt
group by year(receptiondate)
order by year(receptiondate);
【讨论】:
嘿,你能帮我再问一个问题吗?如果我想查找从 2013 年到 2014 年进行的项目,例如接收日期 2013 的项目 ID = 项目 ID 和接收日期 2014,然后显示结转项目。编号项目从 2013 年延续到 2014 年。请 @WonderWoman:这有点复杂,因为当你想每年显示一个结果行时,每一年的行都应该知道下一年的情况。我建议你提出一个新的要求。以上是关于关于 groupby 原因的 Sql Query 问题和错误的主要内容,如果未能解决你的问题,请参考以下文章
Laravel Query Builder groupBy 结合关系
关于mysql的错误 - no query specified