在 SQL 中对具有多列和多行的 table 进行透视和反透视
Pivot and unpivot a table with multiple columns and Rows in SQL
我需要在 table 下面输出,如下所示。
下面是现有数据库 table 输出。
UNIQUE_ID PARTICULARS 18-Jan 18-Feb 18-Mar
----- ----- ----- ----- -----
1 Direct Cost 3,393 3,776 3,776
1 Quarter Q3 FY18 Q3 FY18 Q3 FY18
1 Revenue net Volume Discount 4,409 5,787 5,512
2 Direct Cost 25,022 39,178 34,143
2 Quarter Q2 FY18 Q2 FY18 Q2 FY18
2 Revenue net Volume Discount 28,730 45,507 38,247
我需要将 table 以上的输出转换为以下的输出。
UNIQUE_ID FinancialMonth Quarter DirectCost Revenue net Volume Discount
1 18-Jan Q3 FY18 3,393 4,409
1 18-Feb Q3 FY18 3,776 5,787
1 18-Mar Q3 FY18 3,776 5,512
2 18-Jan Q2 FY18 25,022 28,730
2 18-Feb Q2 FY18 39,178 45,507
2 18-Mar Q2 FY18 34,143 38,247
你能帮我转换一下吗?我已经使用 unpivot 转换了 FinancialMonth,但我无法将 Quarter 转换为 Column.
SELECT UNIQUE_ID
,PARTICULARS
,[FinancialYearMonth] AS 'FinancialMonth'
,CASE WHEN PARTICULARS='Direct Cost'
THEN [FinancialValues] END AS [DirectCost]
,CASE WHEN PARTICULARS='Revenue net Volume Discount'
THEN [FinancialValues] END AS [RevenueNetVolumeDiscount]
FROM DBO.Raw_Monthly
UNPIVOT
(
FinancialValues
FOR [FinancialYearMonth] IN(
Jan18
,[Feb18]
,[Mar18]
)
) AS unpv
在上面的查询中缺少季度值。
FinancialMonth 和 Quarter 都可能与我的理解同时处于逆轴和轴上。你能帮忙解决一下吗?
尝试过的查询在 unpivoting
之后缺少 pivoting
( 条件聚合,例如 case..when
包含通过分组聚合的子句 )。因此,考虑:
SELECT [Unique_ID], [FinancialMonth],
MAX(CASE WHEN [Particulars]='Quarter' THEN [FinancialValues] END) AS [Quarter],
MAX(CASE WHEN [Particulars]='Direct Cost' THEN [FinancialValues] END) AS [DirectCost],
MAX(CASE WHEN [Particulars]='Revenue net Volume Discount' THEN [FinancialValues]
END) AS [Revenue net Volume Discount]
FROM Raw_Monthly
UNPIVOT
(
[FinancialValues] FOR [FinancialMonth] IN ( [18-Jan] ,[18-Feb] ,[18-Mar] )
) AS unpvt
GROUP BY [Unique_ID], [FinancialMonth]
ORDER BY [Unique_ID],
CONVERT(date, REVERSE(SUBSTRING(REVERSE([FinancialMonth]),1,3))+
' 20'+ SUBSTRING(REPLACE([FinancialMonth],'-',''),1,2) , 13)
我需要在 table 下面输出,如下所示。 下面是现有数据库 table 输出。
UNIQUE_ID PARTICULARS 18-Jan 18-Feb 18-Mar
----- ----- ----- ----- -----
1 Direct Cost 3,393 3,776 3,776
1 Quarter Q3 FY18 Q3 FY18 Q3 FY18
1 Revenue net Volume Discount 4,409 5,787 5,512
2 Direct Cost 25,022 39,178 34,143
2 Quarter Q2 FY18 Q2 FY18 Q2 FY18
2 Revenue net Volume Discount 28,730 45,507 38,247
我需要将 table 以上的输出转换为以下的输出。
UNIQUE_ID FinancialMonth Quarter DirectCost Revenue net Volume Discount
1 18-Jan Q3 FY18 3,393 4,409
1 18-Feb Q3 FY18 3,776 5,787
1 18-Mar Q3 FY18 3,776 5,512
2 18-Jan Q2 FY18 25,022 28,730
2 18-Feb Q2 FY18 39,178 45,507
2 18-Mar Q2 FY18 34,143 38,247
你能帮我转换一下吗?我已经使用 unpivot 转换了 FinancialMonth,但我无法将 Quarter 转换为 Column.
SELECT UNIQUE_ID
,PARTICULARS
,[FinancialYearMonth] AS 'FinancialMonth'
,CASE WHEN PARTICULARS='Direct Cost'
THEN [FinancialValues] END AS [DirectCost]
,CASE WHEN PARTICULARS='Revenue net Volume Discount'
THEN [FinancialValues] END AS [RevenueNetVolumeDiscount]
FROM DBO.Raw_Monthly
UNPIVOT
(
FinancialValues
FOR [FinancialYearMonth] IN(
Jan18
,[Feb18]
,[Mar18]
)
) AS unpv
在上面的查询中缺少季度值。
FinancialMonth 和 Quarter 都可能与我的理解同时处于逆轴和轴上。你能帮忙解决一下吗?
尝试过的查询在 unpivoting
之后缺少 pivoting
( 条件聚合,例如 case..when
包含通过分组聚合的子句 )。因此,考虑:
SELECT [Unique_ID], [FinancialMonth],
MAX(CASE WHEN [Particulars]='Quarter' THEN [FinancialValues] END) AS [Quarter],
MAX(CASE WHEN [Particulars]='Direct Cost' THEN [FinancialValues] END) AS [DirectCost],
MAX(CASE WHEN [Particulars]='Revenue net Volume Discount' THEN [FinancialValues]
END) AS [Revenue net Volume Discount]
FROM Raw_Monthly
UNPIVOT
(
[FinancialValues] FOR [FinancialMonth] IN ( [18-Jan] ,[18-Feb] ,[18-Mar] )
) AS unpvt
GROUP BY [Unique_ID], [FinancialMonth]
ORDER BY [Unique_ID],
CONVERT(date, REVERSE(SUBSTRING(REVERSE([FinancialMonth]),1,3))+
' 20'+ SUBSTRING(REPLACE([FinancialMonth],'-',''),1,2) , 13)