【问题标题】:Group several tables on a datetime including same table在一个日期时间对多个表进行分组,包括同一个表
【发布时间】:2016-01-18 21:25:30
【问题描述】:

我正在尝试将多个表格整理到一个单行显示中以用于报告目的 - 所有这些都在日期时间值上。在加入不同的表时,说日期时间值的 CTE,我没有问题。当我遇到具有不同 FK 的表时,我会得到太多记录,无法正常工作。示例

报告结构

DateTime       EngineName    EngineValue  PartName PartValue  Part2Name Part2Value
20160118 00:00 Engine1       100          Part1    100        Part2      200

引擎表

DateTime               EngineName EngineValue
20160118 00:00         Engine1    100

零件表

DateTime               Name(fK)     Value
20160118 00:00         Part1        100
20160118 00:00         Part2        200

此时我已尝试创建日期时间的 CTE,并将日志加入到日期时间的 CTE。我无法完成这项工作,而且我知道我不是第一个创建此类报告的人。

【问题讨论】:

  • 只有 2 个部分还是数量上是动态的?您似乎正在尝试创建一个数据透视表,其中有几个关于 SO 的示例。这是一个这样的示例,用于枢轴中的动态值数量。 stackoverflow.com/questions/10404348/… 如果您只有 2 个部分有问题,那么您可以避免此 SQL 的动态部分。
  • 每台发动机的零件数是否需要始终报告为 2?总是具有不同值的相同“零件名称”?还是动态的? (不同的零件,不同的零件数量等?)

标签: sql sql-server-2012


【解决方案1】:

如果我们假设 Part1 和 Part2 是实际名称并且数量是静态的,那么您可以执行以下操作:

SELECT E.DateTime, E.EngineName, E.EngineValue,  P1.PartName, P1.PartValue,  P2.Part2Name, P2.Part2Value
FROM Engine E
INNER JOIN Part P1
 on E.DateTime = P1.DateTime
and P1.Name = 'Part1'
INNER JOIN Part P2
 on E.DateTime = P1.DateTime
and P2.Name = 'Part2'

如果它们本质上更动态,则需要动态 SQL。

如果总是有 2 个,您可以使用诸如 row_number() over (partition by datetime order by name) 之类的分析作为 RN 并加入第 1 行和第 2 行而不是部件名称。即,而不是 P2.Name ='part2' 使用 P2.RN = 2 但这将其限制为始终只有 2 个部分,我们忽略所有其他部分。

所以真正的问题是:

是否需要报告每个引擎的零件数总是 2?总是具有不同值的相同“零件名称”?还是动态的?

【讨论】:

  • 真正的答案是一切都是相对动态的——甚至“引擎”表也可以有多个引擎。基本上我有来自系统的日志文件,其中每个表都有一个日期时间,并且表中的元素数量可能会有所不同。
  • 在这种情况下,请按照我对您问题的原始评论中的链接了解如何为数据透视表创建动态 SQL。
猜你喜欢
  • 2020-05-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-19
  • 2020-12-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多