2014-05-14 3 views
0

테이블이 있습니다 (finances_history)
이 테이블은 단 하나의 테이블이지만 콘텐츠를 2 블록으로 나누었습니다. 아래 볼 수 있습니다 :
SQL : 다른 행 (다른 달)에있는 열에 동일한 값을 가진 사용자 ID를 선택하십시오.

 

userID || month || bill || value 
------------------------------------ 
u01 || 201401 || energy || 0 
u01 || 201402 || energy || 0 
------------------------------------ 
u02 || 201401 || energy || 0 
u02 || 201402 || energy || 0 
------------------------------------ 
u03 || 201401 || energy || 75 
u03 || 201402 || energy || 0 
------------------------------------ 
u04 || 201401 || energy || 90 
u04 || 201402 || energy || 90 
------------------------------------ 
u05 || 201401 || energy || 85 
u05 || 201402 || energy || 90 
------------------------------------ 
u06 || 201401 || energy || 0 
u06 || 201402 || energy || 0 
------------------------------------ 
 

userID || month || bill || value 
------------------------------------ 
u01 || 201401 || rent || 300 
u01 || 201402 || rent || 300 
------------------------------------ 
u02 || 201401 || rent || 350 
u02 || 201402 || rent || 400 
------------------------------------ 
u03 || 201401 || rent || 0 
u03 || 201402 || rent || 0 
------------------------------------ 
u04 || 201401 || rent || 0 
u04 || 201402 || rent || 0 
------------------------------------ 
u05 || 201401 || rent || 0 
u05 || 201402 || rent || 0 
------------------------------------ 
u06 || 201401 || rent || 0 
u06 || 201402 || rent || 0 
------------------------------------ 


이 테이블에 다른 사용자가 있습니다,하지만 두 달이 경우 년의 다른 달에서 정보를 (기록 월 - 201401, 월 - 201402).

동일한 사용자는 지불 할 두 가지 종류의 지폐 (이 경우에는 에너지와 임대료의 두 가지 종류 만)를 가질 수 있지만 사용자가 지불 할 지폐 중 하나를 가지고 있으면 (적어도 한 달 또는 두 가지 모두), 그는 다른 법안을 가지지 않을 것입니다 (두 달에 다른 법안에 값이 0이 될 것입니다 ...) 또는 두 달에 양쪽 모두 값 0 인 두 법안을 가진 사용자를 가질 수 있습니다.

적어도 4 개의 행과 두 달을 모두 고려한 값이 0 인 지폐 중 하나 이상을 가진 사용자 (사용자 ID)와 청구서의 값 (0이 아닌))는 두 달 모두 동일합니다.

그래서, 위의 샘플에서 사용자에게 u01 및 u04 (조건을 따르는 유일한 사람, 값이 다른 적어도 하나의 법안이 0이 될 수있는 "선택"이 무엇인지 찾고 있습니다. 개월 중 적어도 하나에서 그리고 이들 값은 동일합니다). 월 201,401에 같은 값이 법안의 임대료를 가지고 있으며, 201402.

  • 사용자 U02 때문에 달 201,401과 201,402에 다른 값이 법안의 임대료가 선택되지 않았기 때문에

    • 사용자 U01이 선택됩니다.

    • 사용자 U03 때문에 선택하기 때문에 선택의와 법안 에너지를 가지고있다 달 201,401에 다른 값 법안 에너지와 201402.

    • 사용자 U04을 가지고되지 않습니다 월 201,401에 다른 값이 법안 에너지를 가지고 있으며, 201402.

    • 사용자 u06으로 인해 두 법안 (에너지와 임대료가 선택되지 않기 때문 개월 201,401에 화염 값과 201402.

    • 사용자 U05이 선택되지 않음)을 201401 및 201402 개월의 값 0으로 설정합니다.

    누군가가 나를 도울 수 있기를 바랍니다.
    Ps .: MS SQL Server입니다.

    감사합니다.

  • +0

    (쿼리가 데이터의 2 개보다 많은 개월 잘 작동합니다) 같은 그룹에있는 행의 번호를 사용할 수 있습니까? – Serpiton

    +0

    그래,하지만 나는 SQL에 상당히 익숙하지 않다. 그리고 나는 거기에 가지 않는다. (이것은 querie의 일부에 지나지 않으며, 각 사용자에 대해 하나의 행을 가진 결과를 가지기 위해 CASE를 사용하고있다. 그리고 열은 rent_201401이고, rent_201402, energy_201401, energy_201402 (각자 기자 "가치"를 가져옴) ... 이것을 정렬 할 수있는 코드 아이디어가 있습니까? – user3634947

    +0

    전혀 작동하지 않는 것을 보여주는 것이 nothig를 보여주는 것보다 낫습니다. 몇 가지 아이디어가 있지만 OVER' 절을 사용하면 SQLServer가 2005 이상입니까? – Serpiton

    답변

    0

    일부 통계 함수가 도움이 될 것입니다.

    SELECT DISTINCT userID 
    FROM Utilities 
    GROUP BY userID, bill 
    HAVING AVG(value) > 0 
        AND STDEV(value) = 0 
    ORDER BY userID 
    

    AVG

    평균이고, 조건 0
    STDEV 표준 편차 짧은 긴 이야기 더 다음 지폐 종류의 값의 평균이며, 즉, 표준 편차는 0 때만 모든 인 그룹의 값은 같습니다.

    compount 조건은 항상 동일한 청구서를 지불하는 distinct userID를 얻습니다.

    STDEV은 당신은 아무것도를 시도

    SQLFiddle demo