Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
新值下的SQL按结果集值分组_Sql_Sql Server 2008_Group By_Resultset - Fatal编程技术网

新值下的SQL按结果集值分组

新值下的SQL按结果集值分组,sql,sql-server-2008,group-by,resultset,Sql,Sql Server 2008,Group By,Resultset,我希望将结果集中的某些值分组为新值 我的结果集是: 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

我希望将结果集中的某些值分组为新值

我的结果集是:

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 

你想要这样的吗

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值

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

这里有一个SQLFiddle,其中有一个示例:

您能分享完整的查询和数据示例吗?您分组的名称列是什么?@Mureinik-我已经为您添加了完整的查询。我分组的列是“KS2”,它是Ks2en、Ks2ma或Ks2av中的值,具体取决于SubjectName变量的内容。现在这就是我所说的作业安全性:)有时最好将查询分成多个较小的查询。@Trent注意,我明白了吗?嗨,EricZ,这是正确的。当[Ks2av]位于('1a'、'1b'、'1c')然后是'1'时,特别感兴趣的是
。我已经将其应用于我的代码,但是分组值从结果集中消失。我也接受了建议,我使用了它。我对另一个没有值的表进行了连接设置,所以我添加了值,结果显示ok。将连接更改为左连接,您的代码可以正常工作。谢谢