【问题标题】:SQL Flatten, Pivot, and QuerySQL 扁平化、透视和查询
【发布时间】:2014-04-08 04:39:05
【问题描述】:

我将相当多的数据连接在一起,但我需要旋转这些数据,然后从该查询中选择我想要的字段。数据看起来有点像这样:

ID    OrderNo Product ProductID MetricID Metric       
111 G456789 M12345 10          89         机器    7       
111 G456789 M12345 10          90         MachineID 2020       
111 G456789 M12345 10          91         长度      1951       

上面的结果集可以有任意数量的指标(50 甚至 100 或更多)。该系统是可配置的,因此他们可以添加指标,这意味着我不能真正“硬编码”任何会使 SQL 无效的东西。


当 ID 不同时(如上面的 111),这将是一行。 OrderNo、Product 和 ProductID 也将相同,但 ID 是枢轴的关键。



透视结果集需要这样处理:

ID    OrderNo Product ProductID Machine        MachineID长度
111 G456789 M12345 10          7                  2020        1951   

由于可以有任意数量的指标,我希望它们都在该行中。



现在 - 在我说完这一切之后......我只想查询我需要的变量的结果集。因此,有可能(在上面的示例中)我只查询 ID、产品、机器和长度。

我确信这可以做到.. 只是困惑如何!玩了几个小时试图弄清楚:(

【问题讨论】:

  • 发布您的尝试,如果您尝试过,人们会更愿意提供帮助。
  • 加入非常疯狂并且非常专有。为了我的客户,我不能发布该代码。我可以说的是,我围绕整个事物运行了一个选择(疯狂连接结果集),使用了“pivot”并查询了我需要的特定指标。但是,我发现它仍然列出了其余部分......所以除非我知道如何在查询整个集合后只选择我需要的那些,否则枢轴将不起作用。
  • 所以,像这样:从(疯狂连接结果)中选择 ID、产品、机器、机器 ID、长度(最大(结果)为 Metric in ([Machine]、[MachineID]、[Length) ]))
  • 仅供参考 - 没用 ;)
  • @cbseo 为什么这不起作用?

标签: sql sql-server tsql pivot pivot-table


【解决方案1】:

尝试在聚合中使用 case 语句,如下所示:

SELECT ID,OrderNo, Product, ProductID,
MAX(CASE WHEN Metric='Machine' THEN value END) Machine,
MAX(CASE WHEN Metric='MachineID' THEN value END) MachineID,
MAX(CASE WHEN Metric='Length' THEN value END) Length
FROM Table1
GROUP BY ID,OrderNo, Product, ProductID

【讨论】:

    猜你喜欢
    • 2017-11-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-13
    • 1970-01-01
    相关资源
    最近更新 更多