使用条件指定GROUP BY的组

时间:2014-08-15 18:36:32

标签: sql sql-server sql-server-2008 reporting-services

我甚至不确定这是否可以使用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

3 个答案:

答案 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)

SQL Fiddle

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