【问题标题】:SQL - Join two tables, creating multiple columns with custom outputs from the result of the querySQL - 连接两个表,使用查询结果的自定义输出创建多个列
【发布时间】:2015-03-07 06:52:37
【问题描述】:

我有两张桌子。 表 1 中的相关列如下所示:

[DateField ][H0][H1]...[H23]
 2014-09-01  2   4      2
 2014-09-02  3   1      4
 ...
 2014-09-30  3   3      2

表 2 的相关列如下所示:

[DateField ][Start][End][T-Val][Status]
 2014-09-01  0      4    1      Off
 2014-09-01  5      18   2      Low
 2014-09-01  19     23   1      Off
 2014-09-02  0      10   1      Off
 2014-09-02  11     20   2      Med
 2014-09-02  21     23   1      Off
 ...

我需要得到类似...的输出

[DateField ][H0][H1]...[H23][H0TST][H1TST]...[H12TST]...[H23TST]
 2014-09-01  2   4      2    1_Off  1_Off     2_Low      1_Off
 2014-09-02  3   1      4    1_Off  1_Off     2_Med      1_Off
 ...

另外制作了 24 列,每列的 T-Val 和 Status 值基于与单个日期对应的 Start 和 End 值。

T-Val 和 Status 字段依赖于 Start 和 End 字段,因此 H0TST 将根据 H0TST 中的 0 收集 T-Value 和 Status,具体取决于它所在的 Start 和 End 范围行。

在 DateField 列上加入两个表后,我应该如何构建查询的其余部分?

请帮我指出正确的方向,谢谢!

【问题讨论】:

  • 鉴于您的表结构,我认为这不会起作用。如果您只在 Date 加入,您的额外字段如何知道 Table2 中要使用哪个 T-Val 和 Status?
  • 我更新了问题,谢谢。
  • 我会使用 select 与 join 和 case 条件,这将返回 concat 你的期望值
  • 使用“CASE WHEN .... ELSE '' END”表达式创建您需要的 24 列。您还需要按日期分组,并且只保留每个此类列的 MAX()
  • 知道了。从@jpw 的建议开始,我得到了想要的结果。谢谢大家!

标签: sql sql-server sql-server-2012


【解决方案1】:

我认为聚合的 case 表达式会给你你想要的:

select t1.*, 
    h0tst  = max(case when t1.H0  between t2.start and t2.[end] then concat([T-Val],'-', status) end),
    h1tst  = max(case when t1.H1  between t2.start and t2.[end] then concat([T-Val],'-', status) end),
    h23tst = max(case when t1.H23 between t2.start and t2.[end] then concat([T-Val],'-', status) end )
from table1 t1
join table2 t2 on t1.DateField = t2.DateField
group by t1.DateField, t1.H0, t1.H1, t1.h23

这将产生如下输出:

DateField   H0  H1  H23 h0tst   h1tst   h23tst
2014-09-01  2   4   2   1-Off   1-Off   1-Off
2014-09-02  3   1   4   1-Off   1-Off   1-Off

【讨论】:

  • @shawnt00 对于 SQL Server(和大多数其他数据库),您需要对选择列表中不属于聚合函数的所有列进行分组。它本来可以与 MySQL 一起使用,因为该数据库会执行一些非标准的神奇操作。
猜你喜欢
  • 2016-05-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-27
  • 1970-01-01
  • 2016-05-29
  • 2011-11-24
相关资源
最近更新 更多