【问题标题】:SSMS Joins and COUNT functionSSMS 连接和 COUNT 函数
【发布时间】:2017-11-16 11:31:04
【问题描述】:

我有一个数据库,其中记录了我们为企业各个部门完成的所有工作。

表 1 是部门 - 这将存储部门的名称及其 ID

表 2 是部分——这将部分的名称与它的 ID 一起存储(一个部门可能有几个部分)

表 3 是用户 - 完成任务的人的姓名,以及任务所在的部门和部门 ID)

表 4 是完成日期 - 其中包含完成任务的人员的姓名和提交到系统的日期

大老板要我提供一份报告,详细说明每个部门和部门在特定时间范围内提交了多少工作。

到目前为止,我得到了这个:

SELECT  Dept.DepartmenttId,
Name.SectionId,
count (Name.DepartmentId)  
FROM    Name  
LEFT join Job on Name.UserId = Job.UserId  
WHERE Job.DateSubmitted > '2017-09-01 00:00:00.000' and Job.DateSubmitted <'2017-09-30 23:59:59.000'  
Group by Name.DepartmentId, Name.SectionId

这给了我这样的结果:

BOB      2    3  
STEVE    1    2  

我在其中获取人员姓名以及部门 ID 和部门 ID。

我想要的是:

Bob    IT    Development

所以我可以看到部门和部门的名称,而不是 ID。

我一直在玩连接,但我尝试的一切都打破了计数部分。有没有办法在一个查询中获取计数和名称?到目前为止,我的结构是否有问题?

当前表格:

部门

DepartmentId :: DepartmentName  
1 :: IT  
2 :: Marketing  
3 :: Finance  

部分

SectionId :: SectionName    
1 :: Development  
2 :: Helpdesk  
3 :: Architecture  
4 :: Procurement

名字

Name :: JobId :: DepartmentId :: SectionId   
Bob :: J1234 :: 1 :: 2  
Steve :: J1235 :: 3 :: 4

工作

JOBId :: DateSubmitted  
J1234 :: 02/09/2017  
J1235 :: 04/09/2017

【问题讨论】:

  • 如果没有看到表结构和/或示例数据,很难回答这个问题。我什至不知道您还需要为部门等引入哪些其他专栏。
  • 你不需要 COUNT() 函数
  • 那么有没有其他方法可以获取计数信息?

标签: sql sql-server tsql


【解决方案1】:

请检查以下 SQL 选择

SELECT  
    Name.Name, DepartmentName, SectionName
FROM Name 
INNER JOIN Job on Name.JobId = Job.JobId
INNER JOIN DEPARTMENT on Name.DepartmentID = DEPARTMENT.DepartmentID
INNER JOIN Section on Name.SectionID = Section.SectionID
WHERE 
    Job.DateSubmitted between '2017-09-01 00:00:00.000' and '2017-09-30 23:59:59.000'  

要显示作业计数,您可以使用以下 SQL 查询

SELECT  
    DepartmentName, SectionName, Count(*) as JobCount
FROM Job 
INNER JOIN DEPARTMENT on Name.DepartmentID = DEPARTMENT.DepartmentID
INNER JOIN Section on Name.SectionID = Section.SectionID
WHERE 
    Job.DateSubmitted between '2017-09-01 00:00:00.000' and '2017-09-30 23:59:59.000'
Group By
    DepartmentName, SectionName

【讨论】:

  • 这似乎给了我我需要的数据——从某种意义上说,它是所有名称的列表,以及一段时间内的部门/部门。那么我该如何转换这些数据,以便显示每个部门和部门的工作数量?
  • 我修改了答案并添加了第二个查询
  • 该查询对我不起作用。我觉得问题是inner join是基于name表的,但是name表并没有出现在select语句的任何地方。
【解决方案2】:

根据 Eralper 提供的查询,我想我明白了:

SELECT DepartmentName, SectionName, Count(*) as JobCount  
FROM Name  
INNER JOIN Department on Name.DepartmentId = Department.DepartmentId  
INNER JOIN Section on Name.SectionId = Section.SectionId  
INNER JOIN Job on Name.JobId = Job.JobId  
WHERE Job.DateSubmitted between '2017-09-01 00:00:00.000' and '2017-09-20 23:59:59.000'  
GROUP BY DepartmentName, SectionName   

【讨论】:

    猜你喜欢
    • 2013-10-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多