SQL Server | Узнать количество и категорию - PullRequest
0 голосов
/ 06 июля 2018

Таблица A

Owner   row_no   category
-------------------------
A        1         U
B        1         T
B        2         T
C        1         U
C        2         T
C        3         U
C        4         U

Я ищу решение, которое сохраняет значения в другой таблице, которая должна получить

  1. row_no как 1, если значение равно 1 и должно возвращать max (row_no) -1, если значение не равно 1.

  2. категория должна быть либо T, либо U или оба в зависимости от того, выбрал ли владелец только T или U или оба в ТАБЛИЦЕ A.

Ожидаемый вывод таблицы должен быть примерно таким, как показано ниже.

Owner   row_no   category
---------------------------
A        1         U
B        1         T
C        3        Both

Я попытался использовать следующий подход, который оказался ошибкой.

SELECT * 
INTO B 
FROM A
WHERE ROW_NO LIKE CASE
                     WHEN ROW_NO = 1 THEN ROW_NO
                                     ELSE MAX(ROW_NO) - 1
                  END

Еще не выяснили при поиске категории!

Не могли бы вы помочь с правильным подходом?

Ответы [ 2 ]

0 голосов
/ 06 июля 2018

Одним из способов будет использование GROUP BY:

WITH VTE AS(
    SELECT *
    FROM(VALUES ('A',1,'U'),
                ('B',1,'T'),
                ('B',2,'T'),
                ('C',1,'U'),
                ('C',2,'T'),
                ('C',3,'U'),
                ('C',4,'U')) V([Owner], Row_no, Category))
SELECT [Owner],
       ISNULL(NULLIF(MAX(Row_no) - 1,0),1) AS Row_no,
       CASE WHEN MIN(Category) = MAX(Category) THEN MAX(Category) ELSE 'Both' END AS Category --Assumes Category cannot have a value of NULL
FROM VTE
GROUP BY [Owner];
0 голосов
/ 06 июля 2018

Ваша логика мне не совсем понятна. В частности, здесь я предполагаю, что ваша логика для сообщения row_no должна возвращать 1, когда максимальное значение для владельца равно 1, иначе возвращать это максимальное значение минус 1.

Мы можем попробовать выполнить простой запрос агрегации, чтобы сгенерировать то, что вы хотите.

SELECT
    Owner,
    CASE WHEN MAX(row_no) = 1 THEN 1 ELSE MAX(row_no) - 1 END AS row_no,
    CASE WHEN COUNT(DISTINCT category) > 1 THEN 'Both' ELSE MAX(category) END AS category
FROM tableA
GROUP BY
    Owner;

enter image description here

Демо

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...