我正在编写一个基本的SQL查询,以在基于云的报告工具中构建表,该工具支持多种SQL“方言”(无服务器端对数据库的访问)。我对SQL有一定的了解,并且需要能够为特定的可视化构建基本表。具体来说,我需要在与原始表用逗号分隔的列表中可视化/量化值的每个唯一实例。对于我的示例,Col4具有以不同顺序排列的值a,b,c,d,需要对其进行计数和可视化以显示每个值在每个日期显示多少次(Col1)。
原始表格如下:
我正在使用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
所需的表(为了使可视化工作看起来像这样):
这样,无论原始表中Col4中逗号分隔列表中的位置如何,每次显示“ a”和“ b”时都会显示视觉效果(因此我可以显示“ a”和“ b”的出现次数每月“ b”)
问题是,如果满足第一个WHEN条件之一,则此CASE语句仅返回TRUE。例如,我看到的结果是,如果一个单元格同时包含“ a”和“ b”,则它将仅返回遇到的第一个TRUE条件,并且也不会从同一逗号分隔列表中返回“ b”。相反,如果在“ a”之前列出“ b”(顺序是可变的,因为选择来自最终用户填充的选择列表),则将“ b”返回“ TRUE”,而忽略“ a”。
从本质上讲,无论位置如何,以及同一个逗号分隔的列表中是否有两个值,如何调整此查询以返回?希望有道理,谢谢!
答案 0 :(得分:1)
由于要从同一原始行返回多行,因此需要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
答案 1 :(得分:0)
一段时间以来,我已经在Microsoft SQL Server中使用STUFF
和FOR XML PATH('')
准备了逗号分隔的列表。
如果这种精确的语法对您不起作用,您可能仍会here找到一些有用的信息。
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
输出:
答案 2 :(得分:0)
我重新阅读了您的问题,我认为我现在更好了。您希望将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