在SQL中将多行转换为多列

在SQL中将多行转换为多列,sql,sql-server,tsql,Sql,Sql Server,Tsql,我有一个类似这样的数据: Team Month Count_of_Stores a 4 10 b 4 4 c 4 6 a 5 8 b 5 14 e 5 9 a 6 7 b 6 3 f 6 1 我正在努力获得如下输出:将行转换为列: 门店团队

我有一个类似这样的数据:

Team    Month   Count_of_Stores
  a      4       10
  b      4        4
  c      4        6
  a      5        8
  b      5       14
  e      5        9
  a      6        7
  b      6        3
  f      6        1
我正在努力获得如下输出:将行转换为列:

门店团队月数门店团队月数门店团队月数门店团队月数门店团队月数 a 4 10 a 5 8 a 6 7 b 4 4 b 5 14 b 6 3 c 4 6 e 5 9 f 6 1


我相信pivot在这里应该会有很大的帮助,但在这里的适当用法中会感到困惑。非常感谢您的帮助。

我根据提供的数据推断团队关联。类似下面的内容可能适合您(演示:)

根据新信息更新以下内容(演示:)


您可以在这里使用条件聚合,但如何知道结果的顺序?您无法在发布的数据中对结果进行排序。@SeanLange我实际上是根据另一个标准对其进行分组的,这就是我在这里没有提到的团队。因此,通过这种方式对数据进行排序和分组。好的,但是对于您提供的数据,不可能与排序一致。也许你可以分享更多的细节?是一个很好的起点。@SeanLange谢谢sean!没错。我认为我的数据是不完整的,而“IsItGreyOrGray”建议的代码看起来几乎就在下面。你怎么看?答案中提供的代码几乎是你所能得到的,没有办法确保订购。换句话说,您将获得第4、5和6个月的值,但无法知道每个月的哪个值将显示在彼此旁边。也就是说,一次你可以得到4,10-5,8-6,7,另一次你可以在同一排得到4,6-5,14-6,7。谢谢!这看起来不错。这对我有用。但如果我有不同的队名或Id怎么办。假设我有九个不同的队名或九个参赛者的ID。在这种情况下,是否仍可以将其拆分并进行安排?当我实现这个逻辑时,我想如果我没有错的话,我会留下很多空值。是这样吗?你认为呢?是的,如果你使用不同的名字或ID,你可能会留下空值。如果你有不同的团队跨越不同的月份,你可以按月对他们进行排序,并通过分组使用相同类型的数据轮换。。。类似为了提供最佳的实施建议,我们真的需要看一个例子,看看最终的结果会是什么样的。团队月盘点门店a 4 10 b 4 c 4 6 a 5 8 b 5 14 e 5 9 a 6 7 b 6 3 f 6 1我想得到这样的O/p团队月盘点门店团队月盘点门店团队月盘点门店a 4 10 a 5 8 a 6 7 b 4 b 5 14 b 6 3c 4 6 e 5 9 f 6 1太棒了!像魔术一样工作。谢谢。并对开始时的混乱和不完整数据表示歉意。
CREATE TABLE temp
(
    [teamID] INT,
    [month] INT,
    [count_of_stores] INT
)

INSERT INTO temp
VALUES 
(1,4,10),
(2,4,4),
(3,4,6),
(1,5,8),
(2,5,14),
(3,5,9),
(1,6,7),
(2,6,3),
(3,6,1)

SELECT [teamID], 
    MAX(CASE WHEN MONTH = 4 THEN MONTH END )AS Month,
    MAX(CASE WHEN MONTH = 4 THEN count_of_stores END )  AS Count_of_Stores,
    MAX(CASE WHEN MONTH = 5 THEN MONTH END )AS Month,
    MAX(CASE WHEN MONTH = 5 THEN count_of_stores END )  AS Count_of_Stores ,
    MAX(CASE WHEN MONTH = 6 THEN MONTH END )AS Month,
    MAX(CASE WHEN MONTH = 6 THEN count_of_stores END )  AS Count_of_Stores 
FROM temp
GROUP BY teamID
create TABLE #temp
(
    [teamID] varchar,
    [month] INT,
    [count_of_stores] INT
)

INSERT INTO #temp
VALUES 
('a',4,10),
('b',4,4),
('c',4,6),
('a',5,8),
('b',5,14),
('e',5,9),
('a',6,7),
('b',6,3),
('f',6,1);


WITH monthGrouping AS
(
    SELECT row_number() over (partition by month order by month) as rn, [teamID], [month],[count_of_stores] FROM #temp
)

SELECT 
    MAX(CASE WHEN MONTH = 4 THEN [teamID] END )AS [teamID],
    MAX(CASE WHEN MONTH = 4 THEN MONTH END )AS Month,
    MAX(CASE WHEN MONTH = 4 THEN count_of_stores END )  AS Count_of_Stores,
    MAX(CASE WHEN MONTH = 5 THEN [teamID] END )AS [teamID],
    MAX(CASE WHEN MONTH = 5 THEN MONTH END )AS Month,
    MAX(CASE WHEN MONTH = 5 THEN count_of_stores END )  AS Count_of_Stores ,
    MAX(CASE WHEN MONTH = 6 THEN [teamID] END )AS [teamID],
    MAX(CASE WHEN MONTH = 6 THEN MONTH END )AS Month,
    MAX(CASE WHEN MONTH = 6 THEN count_of_stores END )  AS Count_of_Stores 
FROM monthGrouping
GROUP BY rn