关于 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】:

您希望每年有一个结果行。所以按年分组。您可以通过YEARDATEPART 获得它。然后有条件地计数:

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

JPA多表关联 去重 排序问题

SQL server 关于 GROUP BY 详细讲解和用法

关于mysql group by 的设置

如何通过contentProvider实现groupby查询数据