我甚至不确定这是否可以使用SQL,但我完全坚持这个问题。我有一张这样的桌子:
Total Code
212 XXX_09_JUN
315 XXX_7_JUN
68 XXX_09_APR
140 XXX_AT_APR
729 XXX_AT_MAY
我需要将按代码分组的“总”列相加。问题是“XXX_09_JUN”和“XXX_7_JUN”和“XXX_09_APR”需要是同一个组。
我能够通过创建一个新列来实现这一点,我根据行的代码分配了值,但由于这需要在具有数百万个条目的多个表上完成,所以我不能使用该方法。
是否有某种方法可以根据以下条件对行进行分组:
WHERE Code LIKE '%_09_%' OR Code LIKE '%_7_%'
这不是唯一的条件 - 我需要大约10个这样的条件。对不起,如果没有意义,我不知道如何解释这个......
此外,如果可以更轻松地使用Visual Studio 2008和SSRS完成此操作,那也可以,因为这是此查询的最终目标。
编辑:澄清一下,这将是理想的结果:
Total Code
595 had_a_number
869 had_at
答案 0 :(得分:3)
一种选择是使用CASE
表达式:
GROUP BY CASE
WHEN Code LIKE '%!_09!_%' ESCAPE '!'
THEN 'had_a_number'
WHEN Code LIKE '%!_7!_%' ESCAPE '!'
THEN 'had_a_number'
WHEN Code LIKE '%!_AT!_%' ESCAPE '!'
THEN 'had_at'
ELSE 'other'
END
添加许多WHEN
条件以将任何条件分配给“组”。
请注意,下划线是LIKE
运算符的通配符。下划线将匹配任何单个字符。要搜索文字下划线,您需要在字符串文字中“转义”下划线。
'A_12_E' LIKE '%_12_%' => TRUE
'AB12DE' LIKE '%_12_%' => TRUE
'A_12_E' LIKE '%!_12!_%' ESCAPE '!' => TRUE
'AB12DE' LIKE '%!_12!_%' ESCAPE '!' => FALSE
答案 1 :(得分:1)
MS SQL Server 2008架构设置:
CREATE TABLE TEST_TABLE(Total INT, Code VARCHAR(20))
GO
INSERT INTO TEST_TABLE VALUES
(212, 'XXX_09_JUN'),
(315, 'XXX_7_JUN'),
(68, 'XXX_09_APR'),
(140, 'XXX_AT_APR'),
(729, 'XXX_AT_MAY')
GO
查询1 :
SELECT SUM(Total) Total
,CASE
WHEN Code LIKE '%_%[0-9]%_%'
THEN 'had a number'
WHEN Code NOT LIKE '%_%[0-9]%_%'
THEN 'had at'
END AS Code
FROM TEST_TABLE
GROUP BY CASE
WHEN Code LIKE '%_%[0-9]%_%'
THEN 'had a number'
WHEN Code NOT LIKE '%_%[0-9]%_%'
THEN 'had at'
END
<强> Results 强>:
| TOTAL | CODE |
|-------|--------------|
| 595 | had a number |
| 869 | had at |
答案 2 :(得分:0)
这是一种解决问题的荒谬方式:
架构:
CREATE TABLE tblTotalCode(
Total INTEGER,
Code VARCHAR(15)
)
INSERT INTO tblTotalCode VALUES(212,'XXX_09_JUN')
,(315,'XXX_7_JUN')
,(68, 'XXX_09_APR')
,(140,'XXX_AT_APR')
,(729,'XXX_AT_MAY')
代码:
SELECT CASE WHEN(LEFT(RIGHT(Code, LEN(Code) - CHARINDEX('_', Code, 1)), CHARINDEX('_', RIGHT(Code, LEN(Code) - CHARINDEX('_', Code, 1)), 1) - 1)) IN ('09','7') THEN '09 or 7' ELSE 'Not 09 or 7' END AS '09 or 7 Group'
, SUM(Total) AS 'Total'
FROM tblTotalCode
Group By CASE WHEN(LEFT(RIGHT(Code, LEN(Code) - CHARINDEX('_', Code, 1)), CHARINDEX('_', RIGHT(Code, LEN(Code) - CHARINDEX('_', Code, 1)), 1) - 1)) IN ('09','7') THEN '09 or 7' ELSE 'Not 09 or 7' END