SQL:如何根据同一表中其他列的值创建新列

标签 sql sql-server-2008 tsql pivot

我有 2 个表,主表和单元表。

主表:

Todate   Unit   CategoryID   Quantity
1/7/2012  1        S            300
1/7/2012  1        U            350
2/7/2012  2        S            220
3/7/2012  2        S             50
3/7/2012  2        U            330
4/7/2012  1        S            200
4/7/2012  1        U            180

S = 销售,U = 升级

单位表:
UnitNum   UnitName
1         Measures
2         Performance

我需要得到这个结果:
Todate   UnitNum   UnitName    Sales    Upgrades
1/7/2012    1      Measures     300       350
2/7/2012    2      Performance  220
3/7/2012    2      Performance   50       330
4/7/2012    1      Measures     200       180

这意味着我需要创建 2 列 - 销售和升级,具体取决于 CategoryID 中的值,并且我需要它们在同一行中。
到目前为止我所拥有的是这个
select Todate, Main.Unit, UnitName,
case when CategoryID = 'S' then Quantity end as Sales,
case when CategoryID = 'U' then Quantity end as Upgrades
from Main join Units on Main.UnitNum = Units.UnitNum
group by  Todate, Main.Unit, UnitName

它给了我 2 个新列,但它们在两个单独的行中。

我真的很感激任何帮助解决这个问题!
谢谢

最佳答案

您只需要围绕 case 进行聚合查询。声明。

select m.todate
     , m.unit
     , u.unitname
     , sum(case when m.categoryid = 'S' then quantity end ) as sales
     , sum(case when m.categoryid = 'U' then quantity end ) as upgrages
  from main m
  join units u
    on m.unit = u.unitnum
 group by m.todate, m.unit, u.unitname

关于SQL:如何根据同一表中其他列的值创建新列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11819624/

相关文章:

java - 为什么 HQL-Query 中的参数替换失败但 native 类型成功?

sql - 停止在 SQL Server 中复制大型事务

sql-server - 将垂直结果转换为水平模式(T-SQL)

sql - LTRIM(RTRIM(column_name)) 和 RTRIM(LTRIM(column_name)) 之间的性能有区别吗

sql-server - SQL Server 空间查找剩余距离

mysql - 如果一年内没有发生销售,则缺少行

mysql - 我的计数功能有问题

c# - 窗口服务——等待存储过程得到结果

tsql - 将日期范围转换为每天记录的 SQL 查询

mysql - 如何在不使用 group by 的情况下为此 sql 查询获得相同的结果?