Оператор SQL CASE и несколько условий - PullRequest
0 голосов
/ 08 декабря 2018

Я пишу базовый запрос SQL для построения таблицы в облачном инструменте отчетности, который поддерживает широкий спектр «диалектов» SQL (нет доступа к базе данных на стороне сервера).У меня есть практические знания по SQL, и мне необходимо иметь возможность построить базовую таблицу для конкретных визуализаций.В частности, мне нужно визуализировать / количественно определить каждый уникальный экземпляр значения в списке, разделенном запятыми, из исходной таблицы.В моем примере Col4 имеет значения a, b, c, d в различных порядках, которые необходимо подсчитать и визуализировать, чтобы показать, сколько раз каждое значение отображается для каждой даты (Col1).

Исходная таблицавыглядит следующим образом:

enter image description here

Я использую оператор CASE, поэтому я могу манипулировать маркировкой вывода Col4 в новой таблице, чтобы его было прощевизуализировать.

Вот сокращенный пример того, как выглядит мой запрос:

SELECT 
    Col1, CoL2, 
    CASE 
       WHEN Col4 LIKE '%a' 
          THEN 'custom label for a' 
       WHEN Col4 LIKE '%b%' 
          THEN 'Custom Label for b' 
    END AS 'Column Label' 
FROM 
    Original_Table

Желаемая таблица (для работы визуализации должна выглядеть так):

enter image description here

Таким образом, визуал будет отображаться каждый раз, когда "a" и "b" отображаются независимо от их положения в списке через запятую в Col4 в исходной таблице (так что я могупоказать количество вхождений «a» и «b» в месяц)

Проблема в том, что этот оператор CASE возвращает TRUE, только если выполняется одно из первых условий WHEN.Например, я вижу результаты, в которых, если ячейка содержит и «a», и «b», она будет возвращать только первое встреченное ИСТИННОЕ условие и не будет возвращать «b» из того же списка, разделенного запятыми.И наоборот, если «b» указано перед «a» (порядок является переменным, поскольку выборки происходят из списков выбора, заполненных конечными пользователями), то «b» возвращает «TRUE», а «a» игнорируется.

По сути, как я могу настроить этот запрос, чтобы он возвращался независимо от позиции и независимо от того, есть ли два значения в одном и том же списке через запятую?Надеюсь, что это имеет смысл и спасибо!

Ответы [ 3 ]

0 голосов
/ 08 декабря 2018

Я перечитал твой вопрос и, кажется, теперь понимаю лучше.Вы хотите преобразовать a, b и c в пользовательские метки, верно?

Вы можете использовать несколько вызовов для REPLACE для этого.Потерпи меня!

SELECT 
    Col1, 
    CoL2, 
    REPLACE(
    REPLACE(
    REPLACE(Col4,
        'a', 'Custom Label for a'),
        'b', 'Custom Label for b'), 
        'c', 'Custom Label for c') as ReLabeledCol4
FROM Original_Table
0 голосов
/ 08 декабря 2018

Так как вы хотите вернуть несколько строк из одной исходной строки, вам нужно UNION ALL

SELECT Col1, 'Custom Label for a' AS Col4
  FROM Original_Table
 WHERE Col4 LIKE '%a%'
UNION ALL
SELECT Col1, 'Custom Label for b' AS Col4
  FROM Original_Table
 WHERE Col4 LIKE '%b%'
 ORDER BY Col1, Col4
0 голосов
/ 08 декабря 2018

Я уже некоторое время готовлю списки с разделителями-запятыми, используя STUFF и FOR XML PATH('') в Microsoft SQL Server.

Если этот точный синтаксис у вас не работает, вы все равно можете найти некоторыеполезная информация о том, как это работает здесь .

DECLARE @LetterTypes TABLE (Type CHAR(10))
INSERT @LetterTypes
    VALUES
    ('Consonant'),
    ('Vowell')

DECLARE @Letters TABLE (Letter CHAR(1) NOT NULL, Type VARCHAR(10) NOT NULL)
INSERT @Letters 
    VALUES
    ('A','Vowell'),
    ('B','Consonant'),
    ('C','Consonant'),
    ('D','Consonant'),
    ('E','Vowell'),
    ('F','Consonant'),
    ('G','Consonant'),
    ('H','Consonant'),
    ('I','Vowell'),
    ('J','Consonant'),
    ('K','Consonant'),
    ('L','Consonant'),
    ('M','Consonant'),
    ('N','Consonant'),
    ('O','Vowell'),
    ('P','Consonant'),
    ('Q','Consonant'),
    ('R','Consonant'),
    ('S','Consonant'),
    ('T','Consonant'),
    ('U','Vowell'),
    ('V','Consonant'),
    ('W','Consonant'),
    ('X','Consonant'),
    ('Y','Consonant'),
    ('Z','Consonant')


SELECT
    Type,
    STUFF
    (
        (
            SELECT ', ' + Letter
            FROM @Letters L
            WHERE LT.Type = L.Type
            ORDER BY L.Letter
            FOR XML PATH('')
        ), 1, 2, ''
    ) AS Letters
FROM @LetterTypes LT

Выход:

Output

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