SQL Server - 如果列包含值,则按ID分组

时间:2016-11-14 15:20:49

标签: sql sql-server tsql

我有以下表格:

ID   | NR | Status
1000 | 1  | A
1000 | 2  | A
1001 | 3  | A
1002 | 4  | A
1002 | 5  | N
1003 | 6  | N

我需要一个输出,按ID's对这些输出进行分组。 NR列可以忽略。如果其中一个ID's的记录包含状态A,则会status作为结果。

所以我的输出是:

ID   | Status
1000 | A 
1001 | A 
1002 | A 
1003 | N 

有任何建议/想法吗?

3 个答案:

答案 0 :(得分:3)

执行GROUP BY,使用MIN()为每个ID选择最低状态值,并且A< N!

select id, min(status)
from tablename
group by id

答案 1 :(得分:2)

尽管min()是最简单的方法,但它并不容易推广。另一种方法是:

select id
       (case when sum(case when status = 'A' then 1 else 0 end) > 0
             then 'A'
             else 'N' -- or whatever
        end) as status
from t
group by id;

或者,如果您的表格每id行一行,那么我会使用exists

select ids.id,
       (case when exists (select 1 from t where t.id = ids.id and t.status = 'A')
             then 'A' else 'N'
        end) as status
from ids;

这可以节省group by聚合,并可以使用(id, status)上的索引来获得最佳效果。

答案 2 :(得分:0)

您确切地想要与谓词匹配的记录"如果其中一个具有这些ID的记录包含状态A,则该状态将作为结果给出。" ? 查询可以简单地写为:

    @NgModule({
        imports: [..., HttpModule, ...],
        declarations: [...,
            I18nPipe
        ],
        bootstrap: [AppComponent],
        providers: [..., I18nService,
            {
                provide: APP_INITIALIZER,

            // useFactory: (i18NService: I18nService) => () => i18NService.initMessages(I18Enum.ru),
            // or
            useFactory: initApp,

            deps: [I18nService],
            multi: true
        }
    ]
})
export class TopJavaModule {

}

export function initApp(i18nService: I18nService){
    // Do initing of services that is required before app loads
    // NOTE: this factory needs to return a function (that then returns a promise)
    return () => i18nService.initMessages(I18Enum.ru);  // + any other services...
}

希望这可以提供帮助。