2011-09-19 5 views
2

이 같은 테이블이 :"그룹 기준"과 같은 항목이 있습니까?

:

+----+---------+---------+--------+ 
| id | value_x | created | amount | 
+----+---------+---------+--------+ 

value_x는 6 문자열의 설정은,이 같은 보고서를 작성해야하는 등, "이", "세", "하나"라고 수 있습니다

SELECT SUM(amount), DATE(created) FROM `table_name` WHERE value_x=$some_variable GROUP BY DATE(created) 

그리고 루프 여섯 시간마다 반복에서 $some_variable에 대한 또 다른 값이 쿼리,하지만 난 경우 courious 해요 :

+--------------+-------------------------+-------------------+----------------------+ 
| day_of_month |   "one"   |  "two"  |   [etc.]  | 
+--------------+-------------------------+-------------------+----------------------+ 
| 01-01-2011 | "sum(amount) where value_x = colum name" for this specific day  | 
+--------------+-------------------------+-------------------+----------------------+ 

가장 확실한 해결책이다 단일 쿼리에서이 작업을 수행 할 수 있습니까?

+1

이것은 가능한이 질문의 중복입니다 http://stackoverflow.com/questions/4943496/transpose-rows-into-columns-in-mysql –

+0

더 쉬운 솔루션은 이런 식으로 데이터를 저장하지 않을 것입니다. 'one', 'two', 'three'등이 모두 동일한 데이터를 나타내면 같은 필드에 있어야합니다. – JNK

+0

확인 된 질문은 중복되지 않습니다. GROUP_CONCAT에 대한 것이고 이것은 피벗 테이블입니다. –

답변

4

당신이 요구하는 것을 "피벗 테이블 (pivot table)"이라 부르며 일반적으로 아래와 같이 달성됩니다. 아이디어는 value_x의 각 잠재 가치에 대해 행 당 1 또는 0을 생성하고 각 값의 합계를 얻기 위해 1과 0의 합을 계산합니다.

SELECT 
    DATE(created), 
    SUM(CASE WHEN value_x = 'one' THEN SUM(amount) ELSE 0 END) AS 'one', 
    SUM(CASE WHEN value_x = 'one' THEN SUM(amount) ELSE 0 END) AS 'two', 
    SUM(CASE WHEN value_x = 'one' THEN SUM(amount) ELSE 0 END) AS 'three', 
    etc... 
FROM table_name 
GROUP BY YEAR(created), MONTH(created), DAY(created) 
+0

+1,하지만 OP는 합계 (금액)를 요구하고 있습니다. 따라서 'CASE value_x'일 때 'SUM'(amount)을 1로, 'THEN SUM (양)을 2로했을 때 ....' – Johan

+0

@Johan 네, 고마워요. –

+0

첫 번째 버전도 매우 도움이되었습니다. 감사합니다, 매력과 같은 작품 :) – DzikiMarian

1

이 가까이 올 것이다 :

SELECT 
    s.day_of_month 
    ,GROUP_CONCAT(CONCAT(s.value_x,':',s.amount) ORDER BY s.value_x ASC) as output 
    FROM (
     SELECT DATE(created) as day_of_month 
       ,value_x 
       ,SUM(amount) as amount 
     FROM table1 
     GROUP BY day_of_month, value_x 
     ) s 
GROUP BY s.day_of_month 

당신은 출력을 읽고 적절한 열에서 항목을 배치 할 :하기 전에 value_x를 찾을 필요가있을 것이다.

@ Michael의 접근 방식보다이 접근법의 이점은 사전에 value_x 필드의 가능한 값을 알 필요가 없다는 것입니다.

관련 문제