sql - 旋转数据库表
问题描述
想象一下,我有一个具有以下格式的数据库表:
╔══════════════════════╗
║ Name Quarter Sales ║
╠══════════════════════╣
║ Joe Q1 700 ║
║ Joe Q2 650 ║
║ Joe Q3 660 ║
║ Bill Q1 500 ║
║ Bill Q2 520 ║
║ Bill Q3 550 ║
║ Bob Q2 200 ║
║ Bob Q3 250 ║
╚══════════════════════╝
我需要以如下格式对其进行旋转。这里每个季度的不同值成为一列,每个季度销售额是每个销售人员对应列的值。
╔══════════════════════╗
║ Name Q1 Q2 Q3 ║
╠══════════════════════╣
║ Joe 700 650 660 ║
║ Bill 500 520 550 ║
║ Bob 200 250 ║
╚══════════════════════╝
这可以用 SQL 实现吗?我正在使用 SQL Server,但如果可能的话,我更喜欢纯 SQL。
我们不知道预先进入季度列的值,即我们不仅限于 Q1/Q2/Q3 等。假设用户可以输入 Q1、Quarter 1 或他们喜欢的任何其他内容。
解决方案
我建议PIVOT
改为使用方法。
通过查看上面的评论,您确实希望使 Q1、Q2 季度...动态,因为您可能没有 Quarter 的特定值。
在这里,我更新了我的答案,请尝试一下。
换
PivotSample
你TableName
IF OBJECT_ID('tempdb..##TEMP_TBL') IS NOT NULL
DROP TABLE ##TEMP_TBL
--GET all pivoted column -> [Q1], [Q12]...
DECLARE @pivot_col AS NVARCHAR(MAX)
;WITH distinct_col AS
(
SELECT DISTINCT [Quarter]
FROM PivotSample
)
SELECT @pivot_col = COALESCE(@pivot_col + ',', '') + QUOTENAME([Quarter])
FROM distinct_col
--Generate query, to pivot the data given
DECLARE @query AS NVARCHAR(MAX)
SET @query =
N'SELECT [Name], ' + @pivot_col + ' ' +
'INTO ##TEMP_TBL
FROM PivotSample
PIVOT
(
SUM(Sales)
FOR [Quarter] IN ( ' + @pivot_col + ' )
) AS pvt'
--Execute query, to insert result into ##TEMP_TBL
EXEC sp_executesql @query
--GET all [Quarter] column, to add in ISNULL after PIVOT column -> e.g: ISNULL([Q1], 0) AS [Q1], ISNULL([Q2], 0) AS [Q2]...
DECLARE @col_name AS NVARCHAR(MAX)
;WITH distinct_col AS
(
SELECT DISTINCT [Quarter]
FROM PivotSample
)
SELECT @col_name =
STUFF(
(
SELECT ', ISNULL(' + QUOTENAME([Quarter]) + ', 0) AS ' + QUOTENAME([Quarter])
FROM distinct_col
ORDER BY [Quarter]
FOR XML PATH(''), TYPE
).value('.', 'NVARCHAR(MAX)')
,1 , 1, '')
--Generate query_result, to get result from ##TEMP_TBL after add in ISNULL
DECLARE @query_result AS NVARCHAR(MAX)
SET @query_result =
N'SELECT [Name], ' + @col_name + ' ' +
'FROM ##TEMP_TBL
ORDER BY [Name]'
--Execute query_result, final result shown
EXEC sp_executesql @query_result
推荐阅读
- javascript - 使用引导菜单在 capybara 中注销
- apache-spark - 如何在 Spark UDF 中设置小数返回类型的精度和小数位数?
- typescript - 通用类型 'Dispatch
' 需要 1 个类型参数。TS2314 - javascript - 尝试在 NodeJS 上使用 PFUser
- node.js - Razorpay.validateWebhookSignature() 不适用于 invoice.paid 事件
- c# - 努力在 C# 中将 SQL 查询转换为 LINQ
- leaflet - 访问被 CORS 策略阻止的 XMLHttpRequest:跨源请求
- jquery - 我的 dropkick js 已加载,但 javascript 说 dropkick 不是函数
- spring - Spring Security OAuth2 中的 auth_code 授权是否可以进行匿名身份验证?
- c# - C#模拟局部引用变量