2017-02-14 2 views
0

하나의 열의 최대 날짜를 기준으로 세부 행을 취소하려고합니다. 간단한 max (date.field)를 실행하면 테이블이 작동하지 않습니다.최대 날짜/사례 설명

SELECT 
    HBM_CLIENT.CLIENT_CODE, 
    HBM_NAME.NAME AS CLIENT_NAME, 
    PART_BILL1.PART_CAT_CODE AS BILLING_CODE, 
    PART_BILL1.EMPL_UNO AS BILLING_NAME_UNO, 
    HBM_PERSNL_BILL.EMPLOYEE_NAME AS BILLING_NAME, 
    PART_BILL1.PERCENTAGE AS BILLING_PERCENTAGE 
FROM 
    HBM_CLIENT 
INNER JOIN 
    HBM_NAME ON HBM_CLIENT.NAME_UNO = HBM_NAME.NAME_UNO 
LEFT OUTER JOIN 
    TBM_CLMAT_PART AS PART_BILL1 ON PART_BILL1.CLIENT_UNO = HBM_CLIENT.CLIENT_UNO 
           AND PART_BILL1.PART_CAT_CODE = 'BILL' 
LEFT OUTER JOIN 
    TBM_CLMAT_PART AS PART_BILL2 ON PART_BILL2.CLIENT_UNO = HBM_CLIENT.CLIENT_UNO 
           AND PART_BILL2.EFF_DATE > PART_BILL1.EFF_DATE 
           AND PART_BILL1.PART_CAT_CODE = 'BILL' 
LEFT OUTER JOIN 
    HBM_PERSNL AS HBM_PERSNL_BILL ON PART_BILL1.EMPL_UNO = HBM_PERSNL_BILL.EMPL_UNO 
GROUP BY 
    HBM_CLIENT.CLIENT_CODE, HBM_NAME.NAME, 
    PART_BILL1.PART_CAT_CODE, PART_BILL1.EMPL_UNO, 
    HBM_PERSNL_BILL.EMPLOYEE_NAME, 
    PART_BILL1.PERCENTAGE, 
ORDER BY 
    HBM_CLIENT.CLIENT_CODE 

는 이유는이 쿼리에 대한 문제는 어떤 이유로, 그것은 다시 모든 결과를 가져 오지 않는다는 것을, 그리고 : 나는 원래 내가이 자원 See the entry by Tom H.를 사용하여 구축이 쿼리를 사용하여 문제를 해결 내가 사용한 해결책 때문에.

case 문을 사용하는 것이 더 합리적인지 궁금합니다. 그러나 저는 case 문에 익숙하지 않습니다. 여기

내가 일하고 있어요 쿼리입니다 :

`SELECT 
    HBM_CLIENT.CLIENT_CODE, 
    HBM_NAME.NAME AS CLIENT_NAME, 
    PART_BILL1.PART_CAT_CODE AS BILLING_CODE, 
    PART_BILL1.EMPL_UNO AS BILLING_NAME_UNO, 
    HBM_PERSNL_BILL.EMPLOYEE_NAME AS BILLING_NAME, 
    PART_BILL1.PERCENTAGE AS BILLING_PERCENTAGE, 
    Part_BILL1.EFF_DATE, 
CASE 
    WHEN 
    MAX(Part_BILL1.EFF_DATE) > Part_BILL1.EFF_DATE THEN max(Part_BILL1.EFF_DATE) ELSE Part_BILL1.EFF_DATE END 
FROM HBM_CLIENT 
INNER JOIN HBM_MATTER 
    ON HBM_CLIENT.CLIENT_UNO = HBM_MATTER.CLIENT_UNO 
INNER JOIN HBM_NAME 
    ON HBM_CLIENT.NAME_UNO = HBM_NAME.NAME_UNO 
LEFT OUTER JOIN TBM_CLMAT_PART AS PART_BILL1 
    ON PART_BILL1.CLIENT_UNO = HBM_CLIENT.CLIENT_UNO 
    AND PART_BILL1.PART_CAT_CODE = 'BILL' 
LEFT OUTER JOIN HBM_PERSNL AS HBM_PERSNL_BILL 
    ON PART_BILL1.EMPL_UNO = HBM_PERSNL_BILL.EMPL_UNO 
WHERE 
(HBM_CLIENT.CLIENT_CODE = '065011') 
GROUP BY 
    HBM_CLIENT.CLIENT_CODE, 
    HBM_NAME.NAME, 
    PART_BILL1.PART_CAT_CODE, 
    PART_BILL1.EMPL_UNO, 
    HBM_PERSNL_BILL.EMPLOYEE_NAME, 
    PART_BILL1.PERCENTAGE, 
    Part_BILL1.EFF_DATE 
HAVING 
(Part_BILL1.EFF_DATE = CASE 
WHEN MAX(Part_BILL1.EFF_DATE) > Part_BILL1.EFF_DATE THEN max(Part_BILL1.EFF_DATE) ELSE Part_BILL1.EFF_DATE END)` 

그것은 실행하지만 그것은 즉 그냥 최대 당기는 아니에요, 두 행 대신 중 하나를 나에게 다시 제공합니다. T-SQL을 사용하고 Visual Studio를 사용하여 SSRS를 작성했습니다.

가능한 모든 질문에 기꺼이 답변 해 드리겠습니다. 설명이 좋지 않으면 사전에 사과드립니다.

| CLIENT_CODE | CLIENT_NAME | BILLING_NAME | EFF_DATE | PERCENTAGE | 
| ------------+--------------+--------------+----------+------------| 
| 123456  | Entity, Inc. | Attorney A | 1/1/1990 |50%   | 
| 123456  | Entity, Inc. | Attorney B | 1/1/1990 |50%   | 
| 123456  | Entity, Inc. | Attorney B | 1/1/2017 |50%   | 
| 123456  | Entity, Inc. | Attorney C | 1/1/2017 |50%   | 
+0

당신이 제공 한 참고 자료에는 주어진 데이터가있는 특정 질문이있었습니다. 당신은 그 안에 무엇이 들어 있는지 알지 못하고 엄청난 양의 표를주고 있습니다. 테스트 데이터에서보다 단순화 된 버전을 제공 할 수있는 방법이 있습니까? 기본 데이터를 보지 않고도 세부 사항을 자세히 설명하는 것은 어렵습니다. – djangojazz

+0

@djangojazz 충분히 합리적인 가격입니다! 여분의 물건을 제거 했으므로 거의 동일합니다. 현재 표시된 유일한 테이블은 내가 선택한 필드로 쿼리를 실행하는 데 필요한 테이블입니다. –

답변

0

이는 ORDER BY 절과 함께 SELECT TOP 1 쿼리를 사용하여 단순화 할 수 없습니다? 이 같은

뭔가 :

SELECT TOP 1 
    HBM_CLIENT.CLIENT_CODE, 
    HBM_NAME.NAME AS CLIENT_NAME, 
    PART_BILL1.PART_CAT_CODE AS BILLING_CODE, 
    PART_BILL1.EMPL_UNO AS BILLING_NAME_UNO, 
    HBM_PERSNL_BILL.EMPLOYEE_NAME AS BILLING_NAME, 
    PART_BILL1.PERCENTAGE AS BILLING_PERCENTAGE, 
    Part_BILL1.EFF_DATE, 
    .... 
FROM HBM_CLIENT 
INNER JOIN HBM_MATTER 
    ON HBM_CLIENT.CLIENT_UNO = HBM_MATTER.CLIENT_UNO 
INNER JOIN HBM_NAME 
    ON HBM_CLIENT.NAME_UNO = HBM_NAME.NAME_UNO 
LEFT OUTER JOIN TBM_CLMAT_PART AS PART_BILL1 
    ON PART_BILL1.CLIENT_UNO = HBM_CLIENT.CLIENT_UNO 
    AND PART_BILL1.PART_CAT_CODE = 'BILL' 
LEFT OUTER JOIN HBM_PERSNL AS HBM_PERSNL_BILL 
    ON PART_BILL1.EMPL_UNO = HBM_PERSNL_BILL.EMPL_UNO 
WHERE 
(HBM_CLIENT.CLIENT_CODE = '065011') 
ORDER BY Part_BILL1.EFF_DATE DESC 

이 특별한 그룹이나 케이스 로직을 필요로하지 않고, EFF_DATE에 의해 당신에게 가장 최근의 행을 제공해야합니다.

편집 : 내 의견으로는, 당신이 원하는 결과를 얻을 수있는 가장 좋은 방법은 TOP 절을 활용하는 것입니다. 일반적으로 쿼리를 작성할 때 과 같이 SELECT TOP 1 또는 SELECT TOP 1000을 작성하지만 TOP 절도 다양한 기능을 지원합니다. 하위 검색어, 계산, 변수 및 WITH TIES 기능을 사용하여 원하는 것을 얻을 수 있습니다. 귀하의 경우에는

, 당신은 쿼리는 주어진 CLIENT_CODE의 테이블에서 최대 EFF_DATE 값이됩니다 행의 수, 같은 EFF_DATE 값이 모두 같은 너무 오래 을 반환하고자합니다. 이와 같이

는, 간단히 말해서 나는 당신이 찾고있는 기능을 얻을 수 TOP 절에 WITH TIES 인수를 추가하는 것이 좋습니다 것입니다 :

SELECT TOP 1 WITH TIES 
    HBM_CLIENT.CLIENT_CODE, 
    HBM_NAME.NAME AS CLIENT_NAME, 
    PART_BILL1.PART_CAT_CODE AS BILLING_CODE, 
    PART_BILL1.EMPL_UNO AS BILLING_NAME_UNO, 
    HBM_PERSNL_BILL.EMPLOYEE_NAME AS BILLING_NAME, 
    PART_BILL1.PERCENTAGE AS BILLING_PERCENTAGE, 
    Part_BILL1.EFF_DATE, 
    .... 
FROM HBM_CLIENT 
INNER JOIN HBM_MATTER 
    ON HBM_CLIENT.CLIENT_UNO = HBM_MATTER.CLIENT_UNO 
INNER JOIN HBM_NAME 
    ON HBM_CLIENT.NAME_UNO = HBM_NAME.NAME_UNO 
LEFT OUTER JOIN TBM_CLMAT_PART AS PART_BILL1 
    ON PART_BILL1.CLIENT_UNO = HBM_CLIENT.CLIENT_UNO 
    AND PART_BILL1.PART_CAT_CODE = 'BILL' 
LEFT OUTER JOIN HBM_PERSNL AS HBM_PERSNL_BILL 
    ON PART_BILL1.EMPL_UNO = HBM_PERSNL_BILL.EMPL_UNO 
WHERE 
(HBM_CLIENT.CLIENT_CODE = '065011') 
ORDER BY Part_BILL1.EFF_DATE DESC 

TOP 조항의 다양한 용도의 완전한 설명을 할 수 을 찾을 수 here.

간략하게 설명하기 위해, WITH TIES 인수는 쿼리가을 반환 할 것을 의미합니다 ORDER BY 절에있는 값 (귀하의 경우 EFF_DATE)을 기반으로 한 데이터 세트 10 행그래서 당신은 효과적으로 TOP 1 ROW 아니 검색 하지만 오히려에 대한 TOP 1 VALUE of EFF_DATE

때문에 EFF_DATE에서 같은 값 두 줄 또는 세 개의 행, 5 백, 그들은 모두 반환됩니다이있는 경우 희망이 도움이됩니다.

+0

정확하게 기억한다면 같은 날짜에 두 명의 변호사가있을 수 있으므로 제대로 작동하지 않습니다. Part_bill1.percentage라는 필드가 있습니다. 이 칼럼에서 각 변호사는 50 %의 신용을 얻습니다. 나는 위의 테이블을 개정 할 수 있도록 모바일에 있습니다. 그러나 1999 년 날짜의 변호사와 변호사 모두 50 50 크레딧을 얻습니다. 2017 년 변호사는 변호사를 선임하고 새로운 공동 빌더 인 변호사를 선임합니다. 그래서 그 경우 나는 두 줄의 변호사와 변호사를 불러올 필요가 있습니다. 최대한 빨리 귀하의 제안을 시도하겠습니다 만, 내가 생각하기에 처음과 최대가 내가 한 첫 번째 일이라고 생각합니다. –

+0

확답, 내 상황에서는 작동하지 않습니다. –

+0

@ T.Meyer 귀하의 질문에서 두 개 이상의 행을 찾고 있다는 것을 이해하지 못했습니다. 특히 "열 중 하나의 최대 날짜를 기준으로 한 세부 행"을 원한다고 명시했습니다. 귀하가 설명한 경우, 집계 된 행에 대해 이야기하고 있습니다. 즉, 두 명의 다른 변호사가 단일 행에 나열되기를 원하며, 최대 날짜로 선택해야합니다. – 3BK