SQL Server 用于基于源列创建列名的sql查询,其中值从另一列填充

atmip9wb  于 2023-01-29  发布在  其他
关注(0)|答案(2)|浏览(114)

有人能帮助我把数据从源表转换成我想要的结果表吗?
我想根据源中列出的"类型"创建新的列名,但用于填充的值来自"货币"?希望这有意义。我创建了结果表来显示我试图创建的内容。
源表
| 日期|身份证|类型|通货|
| - ------|- ------|- ------|- ------|
| 小行星20230112|1个|通信|美元|
| 小行星20230112|1个|交换|美元|
| 小行星20230119|第二章|通信|美元|
| 小行星20230119|第二章|交换|英镑|
结果表
| 日期|身份证|通信|兑换货币|
| - ------|- ------|- ------|- ------|
| 小行星20230112|1个|美元|美元|
| 小行星20230112|第二章|美元|英镑|

mv1qrgav

mv1qrgav1#

select [date], id, 
  max(case when type='comm' then currency end) as Comm_cur,
  max(case when type='exch' then currency end) as Exch_cur
from myTable
group by [date], id;

这里是DBFiddle demo
编辑:它是如何工作的?如果我们删除MAX()和GROUP BY:

select [date], id, 
  case when [type]='comm' then currency end as Comm_cur,
  case when [type]='exch' then currency end as Exch_cur
from myTable;

会得到这样的结果
| 日期|身份证|通信|汇率|
| - ------|- ------|- ------|- ------|
| 2023年1月12日|1个|美元|* 无效 |
| 2023年1月12日|1个|
无效 |美元|
| 2023年1月19日|第二章|美元|
无效 |
| 2023年1月19日|第二章|
无效 *|英镑|
如果我们想将这些行减少到每个Date,id为1,我们需要一个GROUP BY。而GROUP BY要求我们为所有未在GROUP BY列表中列出的字段提供一个聚合函数(日期和ID). MAX()和MIN()是我们可以在字符串类型上使用的聚合函数,并且聚合不会考虑NULL,这正是我们所需要的。我们使用MAX()或MIN()只是为了消除NULL。因此,使用MAX()或MIN()和GROUP BY:

select [date], id, 
  MIN(case when [type]='comm' then currency end) as Comm_cur,
  MIN(case when [type]='exch' then currency end) as Exch_cur
from myTable
  group by [date], id;

结果:
| 日期|身份证|通信|汇率|
| - ------|- ------|- ------|- ------|
| 2023年1月12日|1个|美元|美元|
| 2023年1月19日|第二章|美元|英镑|
DBfiddle demo

ljsrvy3e

ljsrvy3e2#

两个快速选择。
条件聚合。通常性能更高,灵活性更强

Select date
      ,id
      ,comm_cur = max( case when [type]='comm' then currency end )
      ,exch_cur = max( case when [type]='exch' then currency end )
 From  YourTable
 Group by date,id

枢轴-带有一些限制

Select *
 From  YourTable src
 Pivot ( max(currency) for [type] in ([comm],[exch]) ) pvt

相关问题