【问题标题】:SQL select based on column value unpivot/pivot column based to row basedSQL select based on column value unpivot/pivot column based to row based
【发布时间】:2020-06-12 08:52:11
【问题描述】:

我发现了很多类似的案例,但不比,让我解释一下,

我有一个如下所示的表格:

D 列值是目标 ID,其他 GRC 列都是目标值(我只是放了虚拟值)

该表有点棘手,因为它看起来像一个数据透视表,我尝试对其进行反透视,但没有成功。 有超过 200 个目标列,因此我们的想法是仅选择列 D 中的目标列。 我通过 IN 实现了这一点,但它使用了一个新目标,然后我必须将其更改为完全不动态。

我的问题是可以从 col 中的 col 中选择“col”,就像从 col D 中选择不同的值一样,然后选择在 D 中的位置


+-----+-----+-----+-------+------------+---------+----------+--------+-------+-------+-------------+
|  A  |  B  |  C  |   D   |     Date   |  GRC03  |    GRC06 | GRC08  | GRC21 | GRC25 |    GRC29    |
+-----+-----+-----+-------+------------+---------+----------+--------+-------+-------+-------------+
| XXX | yyy | zzz | GRC03 | 01/01/2020 |     567 |       89 |     65 |     1 |    87 |          23 |
| Xxx | yyy | zzz | GRC06 | 01/01/2020 |     989 |       76 |     43 |     2 |    56 |          24 |
| XXX | yyy | zzz | GRC08 | 02/01/2020 |      67 |       54 |     21 |     3 |    67 |          89 |
| XXX | yyy | zzz | GRC03 | 02/01/2020 |      41 |       38 |     -1 |     4 |    50 | 111,3333333 |
| Xxx | yyy | zzz | GRC06 | 02/01/2020 |    -209 |     20,5 |    -23 |     5 |    40 | 144,3333333 |
| XXX | yyy | zzz | GRC08 | 03/01/2020 |    -459 |        3 |    -45 |     6 |    30 | 177,3333333 |
+-----+-----+-----+-------+------------+---------+----------+--------+-------+-------+-------------+

我想要的结果

+------------+-------+-------------+
|    DATE    |    D  |   RESULTS   |
+------------+-------+-------------+
| 01/01/2020 | GRC03 |         567 |
| 01/01/2020 | GRC06 |          89 |
| 02/01/2020 | GRC08 |          21 |
| 02/01/2020 | GRC21 |           4 |
| 02/01/2020 | GRC25 |          67 |
| 03/01/2020 | GRC29 | 177,3333333 |
+------------+-------+-------------+

【问题讨论】:

  • 向我们展示一些示例表数据和预期结果 - 全部为格式化文本(不是图像)。minimal reproducible example 是很好的阅读,以获得更好的答案!
  • 好的 thx 我会这样做的 :) 我怎样才能给你一个例子?我猜不是复制粘贴,抱歉我不常来这里:/

标签: sql tsql select case col


【解决方案1】:

我想你想要一个case 表达式:

select d, date,
       (case when d = 'GRC03' then GRC03
             when d = 'GRC06' then GRC06
             when d = 'GRC08' then GRC08
             when d = 'GRC21' then GRC21
             when d = 'GRC25' then GRC25
             when d = 'GRC29' then GRC29
        end) as results
from t;

您还可以使用apply 和过滤器进行反透视:

select t.d, t.date, v.val
from t cross apply
     (values ('GRC03', GRC03),
             ('GRC06', GRC06),
             ('GRC08', GRC08),
             ('GRC21', GRC21),
             ('GRC25', GRC25),
             ('GRC29', GRC29)
     ) v(col, val)
where v.col = d;

【讨论】:

  • 谢谢!我有 200 多列,但它确实有效,非常感谢!
【解决方案2】:

您可以尝试下面示例代码中给出的 UNPIVOT 运算符。

UNPIVOT AND PIVOT BOL

SELECT Date,D, Results
FROM
(SELECT Date, GRC03, GRC06, GRC08...
FROM YourTable
)
UNPIVOT
(
D FOR Results IN (GRC03, GRC06, GRC08...)
) AS GRCReslts

【讨论】:

  • 谢谢!对不起,但没有抓住一切:首先选择,结果列是我想要的反透视表,对吗?然后在第二个中选择 GRC 列是我原始表中的列,对吗?然后 UNPIVOT d 得到结果(这里 = D 中的值然后,?我是对的吗?
猜你喜欢
  • 2015-07-21
  • 2022-12-02
  • 1970-01-01
  • 2022-12-02
  • 2022-11-20
  • 2018-07-13
  • 1970-01-01
  • 2022-12-02
  • 1970-01-01
相关资源
最近更新 更多