【问题标题】:SQL - columns to row without pivotSQL - 没有数据透视的行列
【发布时间】:2018-08-17 09:27:49
【问题描述】:

我正在寻找一种在 SQL Server 中将行转换为列的有效方法。我听说 PIVOT 是为此而生的。但是我的用例有点不同。

实际表格:

   ----------------------------------------
   | Id |Category| Part1  |Part2  |Part3  |
   ----------------------------------------
   | 1  |A       |5       |0      |0      |
   | 1  |B       |0       |1      |3      |
   | 1  |C       |0       |0      |0      |
   | 1  |D       |0       |0      |0      |
   ----------------------------------------

我正在寻找的结果:

   ---------------------------------------------------------
   | Id |Category| xxx    |yyyyy  |zzzzz  |ffffff  |hhhhh  |
   ---------------------------------------------------------
   | 1  |A       |5       |B      |1      |B       |3      |
   ---------------------------------------------------------

这有可能吗?我也在考虑子查询(https://www.dofactory.com/sql/subquery)。

告诉我从哪里开始。谢谢

【问题讨论】:

  • 您在问题文本中编写了 SQL Server,但标记了 MySQL。究竟是哪一个?
  • 你能解释一下这背后的逻辑吗?是 t-sql 还是 Mysql ?
  • 逻辑不健全,至少在我看来
  • “xxx”、“yyyyy”等是什么意思?
  • 为什么fffffC 而不是B

标签: sql sql-server subquery pivot


【解决方案1】:

您可以尝试使用CASE WHENMAX

SELECT ID,
       MAX(CASE WHEN Part1 > 0 then Category end) 'Category',
       MAX(Part1) 'xxx',
       MAX(CASE WHEN Part2 > 0 then Category end) 'yyyyy',
       MAX(Part2) 'zzzzz',
       MAX(CASE WHEN Part3 > 0 then Category end) 'ffffff',
       MAX(Part3) 'hhhhh'
FROM T
GROUP BY ID

Results

| ID | Category | xxx | yyyyy | zzzzz | ffffff | hhhhh |
|----|----------|-----|-------|-------|--------|-------|
|  1 |        A |   5 |     B |     1 |      B |     3 |

如果你想在part 列中求和。你可以使用SUM函数来代替MAX

SELECT ID,
       MAX(CASE WHEN Part1 > 0 then Category end) 'Category',
       SUM(Part1) 'xxx',
       MAX(CASE WHEN Part2 > 0 then Category end) 'yyyyy',
       SUM(Part2) 'zzzzz',
       MAX(CASE WHEN Part3 > 0 then Category end) 'ffffff',
       SUM(Part3) 'hhhhh'
FROM T
GROUP BY ID

Results

| ID | Category | xxx | yyyyy | zzzzz | ffffff | hhhhh |
|----|----------|-----|-------|-------|--------|-------|
|  1 |        A |   5 |     B |     1 |      B |     3 |

【讨论】:

  • 是的,这正是我所需要的。 10q
【解决方案2】:

尝试使用 CASE WHEN:

select id, case when category='A' then category end as category, max(Part1) as xxx,case when category='B' then category end as yyyyy,
max(part2) as zzzzz,
case when category='C' then category end as ffffff,
max(part3) as hhhhh
from tablename
group by case when category='A' then category end, case when category='B' then category end, case when category='C' then category end

【讨论】:

    【解决方案3】:

    效率不高,但如果我不得不这样做,我会使用 Id 字段多次(与一些剩余的列)进行自我合并(与自身合并)以获得您想要的答案。

    正如我之前所说,这不是一个很好的解决方案,但应该可以工作。

    【讨论】:

      猜你喜欢
      • 2016-04-15
      • 1970-01-01
      • 2013-01-28
      • 1970-01-01
      • 2016-11-02
      • 2012-03-24
      • 1970-01-01
      • 2019-09-01
      • 1970-01-01
      相关资源
      最近更新 更多