#sql-server
Вопрос:
У меня есть таблица со следующей информацией.
- Тип заработной платы 1 : Базовая оплата
- Тип заработной платы 46: Личная оплата
Я хочу, чтобы Максимальная базовая заработная плата среди столбцов месяцев i-e 37410 (столбец января) на основе этого максимального значения я хочу, чтобы соответствующее значение личной заработной платы было равно 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)
Комментарии:
1. Распечатайте свои данные, а затем получите строку с максимальным значением.
2. Никогда, никогда , никогда не публикуйте изображения таблиц. Опубликуйте утверждения
CREATE
иINSERT
в виде текста .
Ответ №1:
Это очень плохой дизайн, например, я не могу понять, как вы собираетесь хранить зарплату более одного года. Сказав это, вы можете нормализовать данные, используя 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