ireport에서 SQL을 사용하여 동일한 항목의 여러 합계를 쿼리하는 방법

StackOverflow https://stackoverflow.com/questions/1002639

문제

  • IREPORT를 사용하여 JasperReport를 만들고 있으므로 하나의 SQL 쿼리로 제한됩니다.

  • '이름'(varchar), 'count'(Integer) 및 'dateTime'(dateTime) 열이있는 '통계'가 있습니다.

  • '이름'이 마지막 날의 "테스트"였을 때, 지난 주와 달과 비슷하게 '카운트'열의 합을 얻는 것은 간단합니다 (벨로우 참조).

작동하는 SQL 문 :


SELECT
  SUM(count)as 'today'
FROM
  statistics
WHERE
   name = "test"
  AND $P{oneDayAgo} <= datetime
  AND datetime <= $P{now}
  • 그러나 작업 할 SQL 명령문이 하나만 있으므로 어떻게 든 결합해야합니다. 나는 (벨로우어) Union을 사용하려고 시도했지만 이것은 효과가 없었습니다.

실패한 SQL 문 :

SELECT
     SUM(count)as 'today'
FROM
     statistics
WHERE
     name = "test"
 AND $P{oneDayAgo} <= datetime
 AND datetime <= $P{now}
UNION
SELECT
     SUM(count)as 'thisWeek'
FROM
     statistics
WHERE
     name = "test"
 AND $P{oneWeekAgo} <= datetime
 AND datetime <= $P{now}
UNION
SELECT
     SUM(count)as 'thisMonth'
FROM
     statistics
WHERE
     name = "test"
 AND $P{oneMonthAgo} <= datetime
 AND datetime <= $P{now}

(*) 그래프 나 크로스 탭에 대해서만 추가 쿼리를 추가 할 수 있으며, 그 중 어느 것도 내 목적에 적합하지 않습니다.

도움이 되었습니까?

해결책

sum (-Condition- 다음에 Count else 0 End)

SELECT
  SUM(case when $P{oneDayAgo} <= datetime then count else 0 end) as 'today',
  SUM(case when $P{oneWeekAgo} <= datetime then count else 0 end) as 'thisweek',
  SUM(count) as 'thismonth'
FROM
  statistics
WHERE
   name = "test"
  AND $P{oneMonthAgo} <= datetime
  AND datetime <= $P{now}

평균이 필요한 경우 널을 0으로 대체하십시오.

다른 팁

Union의 쿼리는 동일한 열 (이름, 유형)을 생성해야합니다. 사용하지 않은 열을 NULL로 설정하거나 차별화 열을 사용하십시오.

SELECT
     SUM(count) as `total`,
     'today' as `when`
FROM
     statistics
WHERE
     name = "test"
 AND $P{oneDayAgo} <= datetime
 AND datetime <= $P{now}
UNION
SELECT
     SUM(count) as `total`,
     'thisWeek' as `when`
FROM
     statistics
WHERE
     name = "test"
 AND $P{oneWeekAgo} <= datetime
 AND datetime <= $P{now}
UNION
SELECT
     SUM(count) as `total`,
     'thisMonth' as `when`
FROM
     statistics
WHERE
     name = "test"
 AND $P{oneMonthAgo} <= datetime
 AND datetime <= $P{now}

두 가지 옵션이 있습니다.

1) 각 쿼리의 'AS'부분을 제거하면 이름이없는 1 개의 열로 제공됩니다.

2) 온도 테이블을 만들고 해당 행을 온도 테이블에 삽입 한 다음 온도 테이블을 쿼리하십시오.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top