Sql 从单个表的多行中获取一行

Sql 从单个表的多行中获取一行,sql,sql-server,Sql,Sql Server,我有一张如下表。这里还添加了一些数据 CREATE TABLE [dbo].[ApplicationState]( [ID] [varchar](8) NULL, [State] [int] NULL, [subState] [int] NULL, [SL] [int] NULL, [CanView] [bit] NULL, [CanEdit] [bi

我有一张如下表。这里还添加了一些数据

 CREATE TABLE [dbo].[ApplicationState](
            [ID] [varchar](8) NULL,
            [State] [int] NULL,
            [subState] [int] NULL,
            [SL] [int] NULL,
            [CanView] [bit] NULL,
            [CanEdit] [bit] NULL,
            [CanSave] [bit] NULL,
            [CanApproved] [bit] NULL,
            [CanReject] [bit] NULL
        ) ON [PRIMARY]

        GO
        SET ANSI_PADDING OFF
        GO
        INSERT [dbo].[ApplicationState] ([ID], [State], [subState], [SL], [CanView], [CanEdit], [CanSave], [CanApproved], [CanReject]) VALUES (N'00000001', 5, 2, 1, 1, 0, 0, 0, 0)
        INSERT [dbo].[ApplicationState] ([ID], [State], [subState], [SL], [CanView], [CanEdit], [CanSave], [CanApproved], [CanReject]) VALUES (N'00000001', 5, 3, 1, 1, 0, 1, 0, 0)
        INSERT [dbo].[ApplicationState] ([ID], [State], [subState], [SL], [CanView], [CanEdit], [CanSave], [CanApproved], [CanReject]) VALUES (N'00000001', 5, 4, 2, 1, 0, 0, 1, 1)
        INSERT [dbo].[ApplicationState] ([ID], [State], [subState], [SL], [CanView], [CanEdit], [CanSave], [CanApproved], [CanReject]) VALUES (N'00000001', 5, 2, 2, 1, 1, 0, 0, 0)
需要优化查询(仅显示一行)才能获得以下结果:

ID  | State | CanView | CanEdit | CanSave | CanApproved | CanReject    
1   |  5    |     1   |    1    |    1    |      1      |     1

根据你的评论,这似乎就是你要找的。如果这不符合需要,您需要更好地澄清您的要求

编辑:如Ivan所述,如果您的目标是按ID和状态分组,请执行以下操作:

SELECT
    ID,
    State,
    MAX(CAST(CanView AS INT)) AS CanView,
    MAX(CAST(CanEdit AS INT)) AS CanEdit,
    MAX(CAST(CanSave AS INT)) AS CanSave,
    MAX(CAST(CanApproved AS INT)) AS CanApproved,
    MAX(CAST(CanReject AS INT)) AS CanReject
FROM
    dbo.ApplicationState
GROUP BY
    ID,
    State;

根据你的评论,这似乎就是你要找的。如果这不符合需要,您需要更好地澄清您的要求

编辑:如Ivan所述,如果您的目标是按ID和状态分组,请执行以下操作:

SELECT
    ID,
    State,
    MAX(CAST(CanView AS INT)) AS CanView,
    MAX(CAST(CanEdit AS INT)) AS CanEdit,
    MAX(CAST(CanSave AS INT)) AS CanSave,
    MAX(CAST(CanApproved AS INT)) AS CanApproved,
    MAX(CAST(CanReject AS INT)) AS CanReject
FROM
    dbo.ApplicationState
GROUP BY
    ID,
    State;

根据您的输入和输出要求,我认为您希望任何值大于零,考虑输出1。

SELECT
    ID,
    State,
    Case when  MAX(CanView) > 1 then 1 else 0 end AS CanView,
    Case when MAX(CanEdit) > then 1 else0 end AS CanEdit,
    MAX(CanSave) AS CanSave,
    MAX(CanApproved) AS CanApproved,
    MAX(CanReject) AS CanReject
FROM
    dbo.ApplicationState
GROUP BY
    ID,
    State;

你可以为其他列< /P> < P>根据你的输入并要求输出,我认为你想要任何值大于零,考虑输出1。< /P>

SELECT
    ID,
    State,
    Case when  MAX(CanView) > 1 then 1 else 0 end AS CanView,
    Case when MAX(CanEdit) > then 1 else0 end AS CanEdit,
    MAX(CanSave) AS CanSave,
    MAX(CanApproved) AS CanApproved,
    MAX(CanReject) AS CanReject
FROM
    dbo.ApplicationState
GROUP BY
    ID,
    State;

您可以对其他列执行相同的操作

逻辑是什么?例如,为什么
CanReject
应该是1而不是0?如果任何一行有1,那么对于相同的ID和状态,它的列值将是1。那么
subState
的值是2,3,4,2,但返回1呢?subState列将不会被视为选定列。只考虑上述列。逻辑是什么?例如,为什么
CanReject
应该是1而不是0?如果任何一行有1,那么对于相同的ID和状态,它的列值将是1。那么
subState
的值是2,3,4,2,但返回1呢?subState列将不会被视为选定列。只考虑提到的列。看起来他的目标是按ID和State@IvanStarostin-也许我读错了?:“如果任何一行有1,那么对于相同的ID和状态,它的列值将为1”“操作数数据类型位对于max运算符无效”。如果我们将位值强制转换为整数,那么这个查询将用于我的目的@Nicaruslooks认为他的目标是通过ID和State@IvanStarostin-也许我读错了?:“如果任何一行有1,那么对于相同的ID和状态,它的列值将为1”“操作数数据类型位对于max运算符无效”。如果我们将位值强制转换为整数,那么这个查询将用于我的目的@nicarust那些
可以*
的字段是位,因此它们只能是
0
1
NULL
。因此,不需要大小写逻辑,
MAX()
将不会在
字段上工作。那些
可以*
字段是位,因此它们只能是
0
1
NULL
。因此,不需要大小写逻辑,
MAX()
将不适用于
字段。