如何在SQL语句中使用条件

时间:2019-01-17 02:38:04

标签: sql-server

我要完成的是Group列。

如果一个任务有多个用户在工作,那么我想将其标记为Team,其他标签为individual

Task    Sub-Task    User    Group
1234    9999             A  Team
1234    9998             B  Team
1234    9997             C  Team

2345    6666             A  Team
2345    6665             B  Team

3456    5555             A  Individual A
4567    4444             B  Individual B
5678    3333             C  Individual C

5 个答案:

答案 0 :(得分:1)

您可以使用窗口功能OVER()。当COUNT()大于1 Team时,其他Individual

select  *,
        case when count(User) over (partition by Task) > 1
             then 'Team' 
             else 'Individual' 
             end
from    yourtable

答案 1 :(得分:0)

另一种选择是设置派生表(以CTE或内联方式),该表计算每个任务的用户数。然后,您可以使用它来显示所需的组(与@Squirrel的答案非常相似,只是将窗口函数替换为派生的记录集)。

WITH
    TasksGroupedByUser(Task, UserCount) AS
    (
        SELECT Task, COUNT(DISTINCT [User])
        FROM Tasks
        GROUP BY Task
    )
SELECT
    Tasks.*,
    CASE
        WHEN TasksGroupedByUser.UserCount > 1 THEN 'Group'
        ELSE 'Individual' + ' ' + Tasks.[User]
    END
FROM Tasks
    INNER JOIN TasksGroupedByUser ON
        TasksGroupedByUser.Task = Tasks.Task

答案 2 :(得分:0)

这是您想要的吗?

SELECT Task, SubTask, [User], [Group] = CASE WHEN GroupCount > 1 THEN 'Group' ELSE 'Individual' END
FROM (
    SELECT *, [GroupCount] = (SELECT COUNT(*) FROM TestTable AS B WHERE B.Task = A.Task)
    FROM TestTable AS A) AS C

答案 3 :(得分:0)

我的2美分:

CREATE TABLE #tmp
(
  [Id] BIGINT IDENTITY(1, 1) PRIMARY KEY CLUSTERED,
  [Task] INT,
  [SubTask] INT,
  [User] NCHAR(1),
  [Group] NVARCHAR(32)
)

INSERT INTO #tmp ([Task], [SubTask], [User], [Group]) VALUES (1234, 9999, 'A', 'Team');
INSERT INTO #tmp ([Task], [SubTask], [User], [Group]) VALUES (1234, 9998, 'B', 'Team');
INSERT INTO #tmp ([Task], [SubTask], [User], [Group]) VALUES (1234, 9997, 'C', 'Team');
INSERT INTO #tmp ([Task], [SubTask], [User], [Group]) VALUES (2345, 6666, 'A', 'Team');
INSERT INTO #tmp ([Task], [SubTask], [User], [Group]) VALUES (2345, 6665, 'B', 'Team');
INSERT INTO #tmp ([Task], [SubTask], [User], [Group]) VALUES (3456, 5555, 'A', 'Individual A');
INSERT INTO #tmp ([Task], [SubTask], [User], [Group]) VALUES (4567, 4444, 'B', 'Individual B');
INSERT INTO #tmp ([Task], [SubTask], [User], [Group]) VALUES (5678, 3333, 'C', 'Individual C');

SELECT          [A].[Task],
                [B].[SubTask],
                [B].[User],
                CASE [A].[Cnt]
                WHEN 1 THEN 'Individual ' + [User]
                ELSE 'Team'
                END AS [GroupCalculated],
                [Group],
                [A].[Cnt]

FROM (          SELECT          [Task],
                                COUNT(*) AS [Cnt]
                FROM            #tmp
                GROUP BY        [Task]) AS [A]

INNER JOIN      #Tmp AS [B]
    ON          [B].[Task] = [A].[Task];

DROP TABLE #tmp;

答案 4 :(得分:0)

窗口函数是处理此问题的好方法。使用const FormToolbar = () => ( <CardActions style={{display: 'none'}}> </CardActions> ); const FormDiv = ({controllerProps, ...props}) => ( <Grid container spacing={24}> <Grid item xs={12}> <SimpleForm toolbar={<FormToolbar/>}> <TextField {...props} record={controllerProps.record} source="name"/> </SimpleForm> </Grid> </Grid> ); const OrderShow = props => ( <ShowController {...props} title="Order"> {controllerProps => <Show actions={<ShowActions pageType="show" />} {...props} {...controllerProps}> <SimpleShowLayout> <FormDiv controllerProps={controllerProps} /> </SimpleShowLayout> </Show> } </ShowController> ); export default OrderShow; 窗口功能的棘手部分是它不允许您执行COUNT。因此,如果用户有2个子任务,当我猜您希望它返回1时,它将返回2。

但是,我们可以使用COUNT(DISTINCT ...)MIN窗口函数来查看任务是否只有一个用户。

MAX将在结果集中获得每个任务的“最小”用户值。同样,MIN([user]) OVER (PARTITION BY task)将获得“最大值”。如果它们相同,则意味着该任务只有一个用户,即使同一用户有多个子任务。

MAX

没有窗口功能,这也是一种合适的方法,它与其他答案类似,但是我认为我会在此处包括它,并指出它仅包含不同的用户。

SELECT
    task,
    subtask,
    [user],
    CASE
        WHEN MIN([user]) OVER (PARTITION BY task) = MAX([user]) OVER (PARTITION BY task)
        THEN 'Individual ' + [user]
        ELSE 'Team'
    END
FROM Tasks

由于您打算在相当大的表上运行此程序,因此也许测试两个解决方案的性能可能会有所帮助。