SQL Server - 案例

Sme*_*ead 3 sql sql-server case

CREATE TABLE test
(
sts_id int 
, [status1] int
, [status2] int
, [status3] int
, [status4] int
)
INSERT INTO test values
('1','999','0','0','0'),
('1','100','0','0','0'),
('2','200','999','0','0'),
('3','500','600','999','0'),
('4','200','700','900','998'),
('4','300','400','800','999')
Run Code Online (Sandbox Code Playgroud)

在SQL Server(2016)中,我查询上表以获得最高值<= 900(如果可能)

SELECT DISTINCT 
   sts_id
 , CASE
       WHEN status1 > 0 AND status2 = 0 THEN status1
       WHEN status2 > 900 AND status3 = 0 THEN status1
       WHEN status2 BETWEEN 1 AND 900 AND status3 = 0 THEN status2
       WHEN status3 > 900 AND status4 = 0 THEN status2
       WHEN status3 BETWEEN 1 AND 900 AND status4 = 0 THEN status3
       WHEN status4 > 900 THEN status3 WHEN status4 BETWEEN 1 AND 900 THEN status4
       ELSE status1
   END AS 'status'
FROM test
Run Code Online (Sandbox Code Playgroud)

给我这个:

| sts_ID | status |
|--------|--------|
|  1     |  100   |
|  1     |  999   |
|  2     |  200   |
|  3     |  600   |
|  4     |  800   |
|  4     |  900   |
Run Code Online (Sandbox Code Playgroud)

然后我将它加入到sts_id上的另一个表中,并获取max(status)值.

但是,我不关心900以上的状态,例如sts_id 1会给我999,即使我更喜欢给我100.

有没有什么方法可以合并某种CASE来获得下一个值,如果有一个ID可用?dense_rank()可能有帮助吗?

Aar*_*etz 6

如果您将表格拆分为单个status列,这似乎会更容易.这是一个方法CROSS APPLY:

SELECT sts_id, MAX(status) MaxStatus
FROM TEST
CROSS APPLY (VALUES (status1), 
                    (status2), 
                    (status3), 
                    (status4)
            ) A (status)
WHERE STATUS <= 900
GROUP BY sts_id
Run Code Online (Sandbox Code Playgroud)

结果:

STS_ID  MaxStatus
1       100
2       200
3       600
4       900
Run Code Online (Sandbox Code Playgroud)