2014-06-17 2 views
0

SQL 쿼리로 만든 보고서를 정렬하는 데 도움이 필요합니다.계산 된 값에 대한 SQL 정렬

select (CASE WHEN I4220 = '1' OR I4225='VDRRTN' then 'High' else 'Normal' END) 'Priority', i4224 'Arrived', GETDATE() - Inventory.I4224 'Days in Lab Status',i4201 'Asset', i4202 'Mfg', i4203 'Model', i4204 'Description', i4218 'Loc', i4225 'Status', 
I4214 'Lab', I4205 'LNO', I4299 'State', (CASE WHEN I4223 like '%IN%' THEN 'IN' else 'DIRECT' END) 'Overhead', I4251 'Need By Date' 
from Inventory 
where (i4299 in ('A','I'))and 
    (i4225 in ('DEPVDRTN', 'FLOORCAL', 'LAB', 'VDRRTN')) AND I4240 != 'SV_F35' 
order by I4220 DESC, i4224 ASC; 

나는 '우선 순위'에 의해 쿼리의 결과를 정렬하고 싶지만 우선 순위가 case 문에 기반을 "높음"으로 설정되어 있습니다.

select (CASE WHEN I4220 = '1' OR I4225='VDRRTN' then 'High' else 'Normal' END) 

는 그때 나는 그것이 오름차순으로 날짜별로 정렬하려면, 모든 항목 보고서의 상단에있을 "높음"으로 표시 할 수 있습니다.

아이디어가 있으십니까?

감사합니다. 저스틴.

+1

RDBMS의 기능에 따라'ORDER BY (CASE/* stuff ... */END) '처럼 쉽습니다. –

+0

getdate() 함수로 인해 MySQL 태그가 붙습니다. –

답변

0

당신은 참조 할 수 있습니다 order by 절에 열 별칭 :

더 중요한
select (CASE WHEN I4220 = '1' OR I4225='VDRRTN' then 'High' else 'Normal' END) as Priority, 
     i4224 as Arrived, GETDATE() - Inventory.I4224 `Days in Lab Status`, 
     i4201 as Asset, i4202 as Mfg, i4203 as Model, i4204 as Description, i4218 as Loc, 
     i4225 as Status, I4214 as Lab, I4205 as LNO, I4299 as State, 
     (CASE WHEN I4223 like '%IN%' THEN 'IN' else 'DIRECT' END) as Overhead, 
     I4251 as `Need By Date` 
from Inventory 
where (i4299 in ('A','I'))and 
     (i4225 in ('DEPVDRTN', 'FLOORCAL', 'LAB', 'VDRRTN')) AND I4240 <> 'SV_F35' 
order by Priority, i4224 ASC; 

, 당신은 작은 따옴표 f를 사용하지 말아야 또는 식별자. MySQL에서는 이름을 이스케이프 처리해야하는 경우 backticks를 사용할 수 있습니다. 대부분의 성함은 불필요합니다. 문자열 및 날짜 상수에 대해 작은 따옴표 만 사용하면 이후의 오류를 방지 할 수 있습니다.

마찬가지로, 별칭에 as을 사용하는 것이 좋습니다. 그렇게하면 길잃은 쉼표로 인해 select 절에 문제가 발생하지 않습니다.

+0

감사합니다. Gordon,이 작업은 훌륭하게 수행되었습니다. 이 작업을 이미 시도했지만 순서에 따라 작은 따옴표를 사용하고있었습니다. – Justin

+0

@justin. . . 이제 그들이 왜 나쁜 생각인지 알게되었습니다. –

1

다음과 같은 방법으로 순서대로 계산을 반복 할 수 있습니다 :

select (CASE WHEN I4220 = '1' OR I4225='VDRRTN' then 'High' else 'Normal' END) 'Priority', i4224 'Arrived', GETDATE() - Inventory.I4224 'Days in Lab Status',i4201 'Asset', i4202 'Mfg', i4203 'Model', i4204 'Description', i4218 'Loc', i4225 'Status', 
I4214 'Lab', I4205 'LNO', I4299 'State', (CASE WHEN I4223 like '%IN%' THEN 'IN' else 'DIRECT' END) 'Overhead', I4251 'Need By Date' 
from Inventory 
where (i4299 in ('A','I'))and 
    (i4225 in ('DEPVDRTN', 'FLOORCAL', 'LAB', 'VDRRTN')) AND I4240 != 'SV_F35' 
    order by (CASE WHEN I4220 = '1' OR I4225='VDRRTN' then 'High' else 'Normal' END) ASC; 

또는 당신은 (적어도 TSQL에) 한 번 계산하는 쿼리를 포장 할 수 있습니다

Select * from (
select (CASE WHEN I4220 = '1' OR I4225='VDRRTN' then 'High' else 'Normal' END) 'Priority', i4224 'Arrived', GETDATE() - Inventory.I4224 'Days in Lab Status',i4201 'Asset', i4202 'Mfg', i4203 'Model', i4204 'Description', i4218 'Loc', i4225 'Status', 
    I4214 'Lab', I4205 'LNO', I4299 'State', (CASE WHEN I4223 like '%IN%' THEN 'IN' else 'DIRECT' END) 'Overhead', I4251 'Need By Date' 
    from Inventory 
    where (i4299 in ('A','I'))and 
     (i4225 in ('DEPVDRTN', 'FLOORCAL', 'LAB', 'VDRRTN')) AND I4240 != 'SV_F35' 
) x 
order by 'Priority' ASC; 
+0

이것은 '높음'및 '보통'이 유일한 우선 순위라고 가정합니다. 'h'가 'n'앞에 오므로 우선 순위에 따라 정렬하면 오름차순으로 작업해야합니다. – ps2goat

+0

+1을 래핑합니다. 두 곳에서 같은 조건을 유지하는 것은 문제를 요구합니다. 특히 나중에 편집해야하는 경우에 특히 그렇습니다. –

+0

답장을 보내 주셔서 감사합니다 ps2goat. 고든의 대답은 내가 이미 가지고있는 것에 더 가깝기 때문에 나왔다. – Justin