【问题标题】:SQL GROUP BY result set values under a new valueSQL GROUP BY 结果集值下的新值
【发布时间】:2013-10-04 12:48:26
【问题描述】:

我想将结果集中的某些值分组为新值。

例如我的结果集是:

KS2
2a
3c
4c
3c
2a
2a
1c
No KS2
1b
2c
5c
4c

我在底部组的当前 SQL 结果如下:

KS2
2a
3c
4c
1c
No KS2
1b
2c
5c
4c

我想将值 1a、1b 和 1c 分组到值 1 和 2a、2b 和 2c 下的单行中作为 2。所有其他值应该正常分组。所以我的结果集看起来像:

KS2
2
3c
4c
1
No KS2
5c
4c

这是我的代码:

GROUP BY
CASE Name
    WHEN 'English' THEN
        CASE WHEN [Ks2en]=NULL OR [Ks2en]='' THEN
            'No KS2'
        ELSE
            [Ks2en]
        END
    WHEN 'Mathematics' THEN
        CASE WHEN [Ks2ma]=NULL OR [Ks2ma]='' THEN
            'No KS2'
        ELSE
            [Ks2ma]
        END
    ELSE
        CASE WHEN [Ks2av]=NULL OR [Ks2av]='' THEN
            'No KS2'
        ELSE
            [Ks2av]
        END
    END

编辑:这是基于 EricZ 回答的解决方案:

GROUP BY
       CASE Name
            WHEN 'English' THEN
                CASE WHEN [Ks2en] IS NULL OR [Ks2en]='' THEN
                    'No KS2'
                WHEN [Ks2en] IN ('1a','1b','1c') THEN 
                    '1'
                WHEN [Ks2en] IN ('2a','2b','2c') THEN 
                    '2'
                ELSE
                    [Ks2en]
                END
            WHEN 'Mathematics' THEN
                CASE WHEN [Ks2ma] IS NULL OR [Ks2ma]='' THEN
                    'No KS2'
                WHEN [Ks2ma] IN ('1a','1b','1c') THEN 
                    '1'
                WHEN [Ks2ma] IN ('2a','2b','2c') THEN 
                    '2'
                ELSE
                    [Ks2ma]
                END
            ELSE
                CASE WHEN [Ks2av] IS NULL OR [Ks2av]='' THEN
                    'No KS2'
                WHEN [Ks2av] IN ('1a','1b','1c') THEN 
                    '1'
                WHEN [Ks2av] IN ('2a','2b','2c') THEN 
                    '2'
                ELSE
                    [Ks2av]
                END
            END 

【问题讨论】:

  • 您能分享完整的查询和您的数据示例吗?您分组的名称列是什么?
  • @Mureinik - 我已经为你添加了完整的查询。我要分组的列是“KS2”,它是 Ks2en、Ks2ma 或 Ks2av 中的值,具体取决于 SubjectName 变量的内容。
  • 现在这就是我所说的工作保障 :) 有时最好将查询分成多个较小的查询。
  • @Trent 注意我确定我关注了吗?

标签: sql sql-server-2008 group-by resultset


【解决方案1】:

你想要这样的东西吗?

GROUP BY
CASE 
    WHEN Name = 'English' THEN ISNULL(NULLIF([Ks2en],''),'No KS2')
    WHEN Name = 'Mathematics' THEN  ISNULL(NULLIF([Ks2ma],''),'No KS2')   
    WHEN [Ks2av] IN ('1a','1b','1c') THEN '1'
    WHEN [Ks2av] IN ('2a','2b','2c') THEN '2'    
    ELSE ISNULL(NULLIF([Ks2av],''),'No KS2')
END

请注意,在您的代码中,[Ks2en]=NULL 将始终返回 false,您可以使用 [Ks2en] IS NULL 来检查 NULL 值

【讨论】:

  • 嗨,EricZ,这是正确的。特别感兴趣的是WHEN [Ks2av] IN ('1a','1b','1c') THEN '1'。我已将它应用到我的代码中,但分组值从结果集中消失了。还接受了关于 NULL 的建议。
  • 我怀疑它。我有一个 JOIN 设置到另一个没有值的表 '1',所以我添加了值,它显示正常。将 JOIN 更改为 LEFT JOIN 并且您的代码有效。谢谢。
【解决方案2】:

您可以使用另一个表来存储您的“分组行为”。这可以是一个包含 ('1a', '1')、('1b', '1')、('2a', '2') 等条目的两列表。

这是一个 SQLFiddle,其中有一个示例: http://sqlfiddle.com/#!2/deb87/7

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-04
    相关资源
    最近更新 更多