首页 > 解决方案 > 基于没有聚合的值旋转两列

问题描述

在询问之前我尝试搜索,但我没有找到与我试图弄清楚的类似的东西。我使用 sql server 来实现这一点。

现在的情况

在此处输入图像描述

基于年份的目标,我想调整:

在该示例中,前 36 行应变为一行。每一年都应该有一排。

A  B C   D YEAR E F HiBioInsec HiChemInsec etc
76 1 191 4 2020       5000        2000
76 1 191 4 2021       5000        2000

我尝试使用 pivot 和 max,但没有得到预期的输出。有什么想法吗?

标签: sqlsql-servertsqlpivot

解决方案


实际上,PIVOT 似乎正是您所需要的。你的看起来像这样吗?这对我有用。

CREATE TABLE dbo.YourTable
(
  A int,
  B int,
  C int,
  D int,
  [Year] int,
  E int,
  F int,
  col varchar(30),
  [value] int
);

INSERT dbo.YourTable (A,B,C,D,[Year],col, [value]) 
VALUES (76, 1, 191, 4, 2020, 'HiBioInsec', 5000);

INSERT dbo.YourTable (A,B,C,D,[Year],col, [value]) 
VALUES (76, 1, 191, 4, 2020, 'HiChemInsec', 2000);

INSERT dbo.YourTable (A,B,C,D,[Year],col, [value]) 
VALUES (76, 1, 191, 4, 2021, 'HiBioInsec', 5000);

INSERT dbo.YourTable (A,B,C,D,[Year],col, [value]) 
VALUES (76, 1, 191, 4, 2021, 'HiChemInsec', 2000);

SELECT A,B,C,D,[Year],E,F
    , pvt.HiBioInsec
    , pvt.HiChemInsec
FROM
(
   SELECT A,B,C,D,[Year],E,F,col, SUM([value]) AS SumValue
   FROM dbo.YourTable [tbl]
   GROUP BY A,B,C,D,[Year],E,F,col
) src
PIVOT (SUM(SumValue) FOR col IN ([HiBioInsec],[HiChemInsec])) pvt

你能发布你的SQL吗?

您也可以尝试这样的事情,但我不知道如何使用聚合来解决问题。

SELECT A,B,C,D,[Year],E,F
, SUM(HiBioInsec) AS HiBioInsec
,SUM(HiChemInsec) AS HiChemInsec
FROM
(
SELECT A,B,C,D,[Year],E,F, [value] AS HibioInsec ,NULL AS HiChemInsec
FROM dbo.YourTable WHERE col = 'HiBioInsec'

UNION ALL

SELECT A,B,C,D,[Year],E,F, NULL AS HibioInsec , [value] AS HiChemInsec
FROM dbo.YourTable WHERE col = 'HiChemInsec'
) tbl
GROUP BY A,B,C,D,[Year],E,F

推荐阅读