【问题标题】:Convert Rows into Columns with Columns Grouping in SQL Server在 SQL Server 中使用列分组将行转换为列
【发布时间】:2016-07-11 20:51:10
【问题描述】:

我想在下面实现,但不知道从哪里开始:

我从 SQL 查询得到以下输出:

LocationID     ItemID     ItemName     Price1     Price2 
---------------------------------------------------------
1               101        A             100         150 
1               102        B             220         170 
2               103        C             120         155 
2               104        D             123         160 
3               105        E             158         179 
3               106        F             160         180 

现在我想让我的输出看起来像这样:

                           LocationID 1           LocationID 2
ItemID     ItemName     Price1     Price2     Price1     Price2 
---------------------------------------------------------
101        A             100         150      0           0 
102        B             220         170      0           0 
103        C             0           0        120         155 
104        D             0           0        123         160
105        E             0           0        0           0
106        F             0           0        0           0

我如何在 SQL 中做同样的事情,如果有人可以指导我,不胜感激。

P.S ItemID 和 ItemName 来自一个与 LocationID 连接的主表。

【问题讨论】:

  • 您标记 3 个不同版本的 SQL Server 是否有原因?
  • 您可以使用交叉表执行此操作,也称为条件聚合。第一个问题是,总是有两个位置吗?如果位置的数量不同,则采用不同的方法。
  • @SeanLange 是的,位置固定在这里
  • 我正要发布一个答案,但它没有意义。输出中的行数相同。对于输出位置 2 中的每一行,值都是相同的。它们应该是什么?它们来自哪里??
  • @SeanLange Ohh..对不起,我现在已经更正了我的帖子,

标签: sql sql-server sql-server-2008 sql-server-2012 sql-server-2008-r2


【解决方案1】:

就像我说的......条件聚合。

if OBJECT_ID('tempdb..#Something') is not null
    drop table #Something

CREATE TABLE #Something
(
    LocationID int
    , ItemID int
    , ItemName char(1)
    , Price1 int
    , Price2 int
)

insert #Something
select 1, 101, 'A', 100, 150 union all
select 1, 102, 'B', 220, 170 union all
select 2, 103, 'C', 120, 155 union all
select 2, 104, 'D', 123, 160 union all
select 3, 105, 'E', 158, 179 union all
select 3, 106, 'F', 160, 180;

select LocationID
    , ItemName
    , Location1_Price1 = MAX(case when LocationID = 1 then Price1 else 0 end)
    , Location1_Price2 = MAX(case when LocationID = 1 then Price2 else 0 end)
    , Location2_Price1 = MAX(case when LocationID = 2 then Price1 else 0 end)
    , Location2_Price2 = MAX(case when LocationID = 2 then Price2 else 0 end)
from #Something
group by LocationID
    , ItemName

【讨论】:

  • 如果我想让我的 LocationID 被动态加载,在这种情况下我会在上面的代码中改变什么?
  • 您将首先提供有关问题的所有详细信息。你能解释一下你的意思吗?也许提供一些实际的表格(就像我在答案中所做的那样)。
  • 我的意思是,如果稍后我添加了另外 20 个 LocationID,而不是硬编码相同,我可以从另一个主表动态地带来它吗,如果是的话,需要在上面的查询中进行哪些更改?
  • 这里的要求仍然很模糊。我猜你需要使用动态交叉表。您可以在此处阅读有关如何实现此目的的信息。 sqlservercentral.com/articles/Crosstab/65048
猜你喜欢
  • 2013-10-01
  • 1970-01-01
  • 1970-01-01
  • 2023-01-25
  • 2010-09-14
  • 2021-02-24
  • 2010-10-22
相关资源
最近更新 更多