【问题标题】:Join two query results where one is created from column values连接两个查询结果,其中一个是从列值创建的
【发布时间】:2016-07-04 13:08:37
【问题描述】:

我有一张桌子

表 1:

Name|Starttime|Endtime|Project_Number
Frank|   12:00|  16:00|Project1
Frank|   08:00|  16:00|Project2
Andre|   09:00|  16:00|Project4
Andre|   11:00|  16:00|Project5

我试图完成一个表格,显示所有一起工作的时间以及每个项目的时间,如下所示:

表 2:

Name |All|Project1|Project2|Project3|Project4
Andre|12 |4       |8       |Null    |Null
Frank|12 |Null    |Null    |7       |5

我可以得到所有人的结果

Select Name, sum(datediff(Minute, Starttime, Endtime)) from Table1
group by Name, sum(datediff(Minute, Starttime, Endtime))

我也可以为Table2 完成此操作(也可以通过项目组完成),但我只是没有得到我想要的结果。我已经尝试过UNION,但这只是映射表格。

谁能帮我完成这项工作?

【问题讨论】:

  • 预期的查询结果是什么?
  • 我的问题中的Table2是预期的结果。
  • 项目编号是否有特殊限制,或者可以是任意编号。
  • 数字是随机分配的,但不能超过5位。
  • 什么rdbms?

标签: sql tsql


【解决方案1】:

在派生表中进行datediff 计算。 (为了保持代码漂亮!)

然后使用case表达式进行条件聚合:

select Name,
       sum(ts),
       sum(case when Project_Number = 'Project1' then ts end) as Project1,
       sum(case when Project_Number = 'Project2' then ts end) as Project2,
       sum(case when Project_Number = 'Project3' then ts end) as Project3,
       sum(case when Project_Number = 'Project4' then ts end) as Project4
from
(
    select Name, datediff(Minute, Starttime, Endtime) as ts, Project_Number
    from Table1
)
group by Name

你也可以跳过派生表:

select Name,
       sum(datediff(Minute, Starttime, Endtime)),
       sum(case when Project_Number = 'Project1' then datediff(Minute, Starttime, Endtime) end) as Project1,
       sum(case when Project_Number = 'Project2' then datediff(Minute, Starttime, Endtime) end) as Project2,
       sum(case when Project_Number = 'Project3' then datediff(Minute, Starttime, Endtime) end) as Project3,
       sum(case when Project_Number = 'Project4' then datediff(Minute, Starttime, Endtime) end) as Project4
from Table1
group by Name

【讨论】:

  • 总结,而不是聚合。
  • @onedaywhen,我会说总结是一种聚合等等。
【解决方案2】:

使用 CTE

;with
t1 as (  -- your data table
    select * 
    from (
        values
        ('frank', cast('12:00' as time), cast('16:00' as time), 'Proj1'),
        ('frank', cast('08:00' as time), cast('16:00' as time), 'Proj2'),
        ('andre', cast('09:00' as time), cast('16:00' as time), 'Proj3'),
        ('andre', cast('11:00' as time), cast('16:00' as time), 'Proj4')
    ) x (name,startt,endt, prjn) 
),
t2 as (  -- precalc hours per project
    select name, prjn, datediff(hour, startt, endt) difft
    from t1 
),
t3 as (  -- precalc hours per name
    select name, SUM(difft) allt
    from t2
    group by name
),
t4 as (  -- table to pivot
    select t2.*, t3.allt
    from t2
    inner join t3 on t2.name = t3.name  
)
select *
from t4
pivot (sum(difft) for prjn in (Proj1, Proj2, Proj3, Proj4)) p
order by name

tadaaa

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-05-23
    • 2015-10-17
    • 2021-04-20
    • 2011-05-16
    • 2014-01-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多