Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/25.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 server sqlserver中的CASE语句逻辑_Sql Server_Case - Fatal编程技术网

Sql server sqlserver中的CASE语句逻辑

Sql server sqlserver中的CASE语句逻辑,sql-server,case,Sql Server,Case,我正在SQL Server 2014上工作,我正在努力想出CASE语句逻辑,以便在permnum、DiscipliancIncidentNumber和DateOfDisciplianaryAction值重复时,将纪律ActionReasonCode值更改为“seq”值为1的记录。下面的SQL代码就是我所尝试的。您将看到,在我所附的图像中,我需要根据上面所述将41值更改为21 任何帮助/指导都将不胜感激。多谢各位 以下是我的SQL代码: DECLARE @SchoolYear varchar(4)

我正在SQL Server 2014上工作,我正在努力想出CASE语句逻辑,以便在permnum、DiscipliancIncidentNumber和DateOfDisciplianaryAction值重复时,将纪律ActionReasonCode值更改为“seq”值为1的记录。下面的SQL代码就是我所尝试的。您将看到,在我所附的图像中,我需要根据上面所述将41值更改为21

任何帮助/指导都将不胜感激。多谢各位

以下是我的SQL代码:

DECLARE @SchoolYear varchar(4) = '2016'
DECLARE @Submission int = 3;

SELECT @SchoolYear as SchoolYear, 
    @Submission AS Submission, 
    '220905' AS DistrictID, 
    Row_number() OVER (partition by A.incnum, A.locid ORDER BY A.dispnum DESC) as seq,
    A.permnum, 
    B.txuniqueid, 
    '220905' + A.disschnum AS CampusIDofEnrollment, 
    stuff(A.incnum, 1, 0, replicate('0', 6 - len(A.incnum))) AS DisciplinaryIncidentNumber,
    **CASE 
        WHEN ROW_NUMBER() OVER (PARTITION BY A.incnum, A.locid ORDER BY A.dispnum DESC) > 2     
        AND COUNT(A.PERMNUM) > 1
        AND COUNT(STUFF(A.incnum, 1, 0, REPLICATE('0', 6 - LEN(A.incnum)))) > 1
        AND COUNT(CONVERT(VARCHAR(10), A.dateofdisciplinaryaction, 120) > 1
        THEN 

        --WHEN A.desccode LIKE 'XSTA-[0-9][0-9]%' THEN Substring(A.desccode, 6, 2) ELSE Substring(A.desccode, 1, 2) 
    END AS DisciplinaryActionReasonCode,**
    CONVERT(VARCHAR(10), A.dateofdisciplinaryaction, 120) AS DateofDisciplinaryAction 
FROM [dbo].[XXdiscipline] A 
INNER JOIN [dbo].[XXstudents] B 
ON A.permnum = B.permnum 
WHERE (A.desccode LIKE '[0-9][0-9]%' OR A.desccode LIKE 'XSTA%') 
AND (A.dispcode LIKE '[0-9][0-9]%' OR A.dispcode LIKE 'XSTA-[0-9][0-9]%') 
AND A.PERMNUM = 1042003
ORDER BY permnum asc, DisciplinaryIncidentNumber asc,  a.DISPNUM asc

下面是SQL结果的图像:

我认为您可以根据您在文本问题正文中所说的关于如何确定重复项的内容来简化您的案例陈述:

CASE 
    WHEN ROW_NUMBER() OVER (PARTITION BY A.incnum, A.dateofdisciplinaryaction, A.permnum ORDER BY A.dispnum DESC) = 1     
    THEN 21
    ELSE 41
END AS DisciplinaryActionReasonCode,
(如果你的21和41应该是相反的,把它们交换过来)


(事实上,你的规范没有多大意义,因为你给我们展示了一列主要是21,但一行是41,你说你想把代码从41改为21,但这只是一个简单的
21,作为一个原则性的理由code

从另一个论坛的用户那里获得一些帮助,我发现案例陈述并非我所希望的解决方案。我为我的SQL代码创建了一个CTE语句,然后能够使用SQL Server中内置的FIRST_VALUE函数查询正确的结果,这是SQL Server Central的Luis建议的。这是最后的解决方案,希望它能帮助其他人:

SELECT SchoolYear, Submission, DistrictID, PERMNUM, DisciplinaryIncidentNumber, FIRST_VALUE(DisciplinaryActionReasonCode) OVER(PARTITION BY SchoolYear, Submission, DistrictID, PERMNUM ORDER BY seq) as DisciplinaryActionReasonCode
FROM CTE1
ORDER BY PERMNUM asc, DisciplinaryIncidentNumber asc, DisciplinaryActionReasonCode asc;

行号…=2是用于测试的一部分还是逻辑的一部分?如果行数=3怎么办?不确定您在问什么。但在继续别名a、b、c之前,你可能会读到这篇文章……感谢各位的回复。行号应为>1,我将进行更正。底线是,从所附的PIC I中,纪律行动原因代码列中的41值需要反映21,其中记录的序号值为1。希望有帮助。感谢您的回复。您在问题文本“permnum,StripularyIncidentNumber和DateofDisciplinaryAction值重复”中所说的内容,以及您在sql
分区中所说的A.incnum,A.locid。。。计数(A.PERMNUM)。。。计数(CONVERT(VARCHAR(10),A.dateofdisciplinaryaction,120)>1不同。请确定确定确定重复项的标准是什么谢谢,我希望这么简单。值可能不总是21或41。遗憾的是,我的水晶球最近工作得不太好;如果您需要帮助,您需要说明从何处获取21、41或其他_编号…但这并不太难,只需替换为2即可1、41等,列名称或公式计算/提供新代码谢谢Caius。我感谢您的时间。嗨,伙计们,我为所有的困惑道歉。我感谢您下次花时间回复并帮助我更清楚地沟通。我终于能够解决临时表的问题。谢谢。