sql-server - 如何根据SQL中列之间的最大值从表中获取对应的列值
问题描述
- 工资类型 1:基本工资
- 工资类型 46:个人工资
我想要基于此最大值的 Months 列中的 Basic Pay Max 即 37410(Jan 列)我想要对应的 Personal Pay Value 为 0。我想要 SQL 查询以获取以下结果
对上表使用以下创建和插入。
CREATE TABLE [dbo].[Salary](
[PNO] [bigint] NULL,
[WageType] [int] NULL,
[Jul] [bigint] NULL,
[Aug] [bigint] NULL,
[Sep] [bigint] NULL,
[Oct] [bigint] NULL,
[Nov] [bigint] NULL,
[Dec] [bigint] NULL,
[Jan] [bigint] NULL,
[Feb] [bigint] NULL,
[Mar] [bigint] NULL,
[Apr] [bigint] NULL,
[May] [bigint] NULL,
[Jun] [bigint] NULL
) ON [PRIMARY]
和插入
INSERT INTO [dbo].[Salary]
([PNO] ,[WageType] ,[Jul],[Aug] ,[Sep],[Oct],[Nov],[Dec],[Jan],[Feb],[Mar],[Apr],[May],[Jun])
VALUES (123, 1,33670,33670,36240,36240,37410,37410,0,0,0,0,0,0)
INSERT INTO [dbo].[Salary]
([PNO] ,[WageType] ,[Jul],[Aug] ,[Sep],[Oct],[Nov],[Dec],[Jan],[Feb],[Mar],[Apr],[May],[Jun])
VALUES (123, 46,730,730,0,0,0,0,0,0,0,0,0,0)
解决方案
这是一个非常糟糕的设计,例如,我看不出你将如何存储超过一年的工资。CROSS APPLY
话虽如此,您可以使用然后执行一些聚合来规范化数据:
WITH cte1 AS (
SELECT pno, mon, MAX(wage1) AS wage1, MAX(wage46) AS wage46
FROM t
CROSS APPLY (VALUES
(1, CASE WHEN wagetype = 1 THEN Jan END, CASE WHEN wagetype = 46 THEN Jan END),
(2, CASE WHEN wagetype = 1 THEN Feb END, CASE WHEN wagetype = 46 THEN Feb END),
(3, CASE WHEN wagetype = 1 THEN Mar END, CASE WHEN wagetype = 46 THEN Mar END),
(4, CASE WHEN wagetype = 1 THEN Apr END, CASE WHEN wagetype = 46 THEN Apr END),
(5, CASE WHEN wagetype = 1 THEN May END, CASE WHEN wagetype = 46 THEN May END),
(6, CASE WHEN wagetype = 1 THEN Jun END, CASE WHEN wagetype = 46 THEN Jun END),
(7, CASE WHEN wagetype = 1 THEN Jul END, CASE WHEN wagetype = 46 THEN Jul END),
(8, CASE WHEN wagetype = 1 THEN Aug END, CASE WHEN wagetype = 46 THEN Aug END),
(9, CASE WHEN wagetype = 1 THEN Sep END, CASE WHEN wagetype = 46 THEN Sep END),
(10, CASE WHEN wagetype = 1 THEN Oct END, CASE WHEN wagetype = 46 THEN Oct END),
(11, CASE WHEN wagetype = 1 THEN Nov END, CASE WHEN wagetype = 46 THEN Nov END),
(12, CASE WHEN wagetype = 1 THEN Dec END, CASE WHEN wagetype = 46 THEN Dec END)
) AS ca(mon, wage1, wage46)
WHERE wagetype IN (1, 46)
GROUP BY pno, mon
), cte2 AS (
SELECT *, ROW_NUMBER() OVER (PARTITION BY pno ORDER BY wage1 DESC, mon ASC) AS rn
FROM cte1
)
SELECT *
FROM cte2
WHERE rn = 1
推荐阅读
- c# - asp 表单的操作过滤器
- java - 将元素添加到 java 中的实体列表或从本地查询 hibernate 创建它
- postgresql - POSTGRESQL:如何将日期转换为整数?
- amazon-web-services - 红移:500310 无效操作
- python - 我有 skimage 版本 0.12。我想专门下载0.14版本。我怎么做?
- javascript - 如何避免 JavaScript 中的空指针错误?
- c# - 将 3D 数组从 C# 转换为 Matlab 的 MWNumericArray 是否有大小限制?
- php - 使用 wiki api 从标题获取页面 id 无英语
- python - 将模态表单中的数据插入数据库
- javascript - 将选项的值解析为 html 属性