Как получить соответствующее значение столбца из таблицы на основе максимальных значений между столбцами в SQL

#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