2013-07-29 4 views
1

2013 년 1 월에 날짜가있는 행이 세 개있는 경우 행 수가 세 개인 행이 4 개인 경우 당신의 기본 데이터가 새 테이블 밖으로되지 않습니다 변경할 때SQL - 월 기반 열 및 연도 기반 행을 사용하여 사용자 지정 테이블 만들기

 Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec 
2013 3 0 0 0 0 0 0 0 0 0 0 0 
2014 0 0 4 0 0 0 0 0 0 5 0 0 
+0

을 달성하지만 테이블 디자인이 그것을위한 최상의 방법이라고는 생각하지 않습니다. –

답변

0

내가 오히려 새 테이블보다 뷰를 사용하여이 방법을 추천 할 것입니다 : 2014 년 10 월 년 3 월 2014 오 테이블은로 표시 할 동기화. 당신은 많은 샘플 데이터를 제공하지 않았으므로

나는 구조를 생각해야했다,하지만 당신은 다음과 같이 할 것 : 나는 당신이 원하는 것을 모르는

CREATE TABLE T (`Date` DATETIME); 
INSERT T (`Date`) 
VALUES 
    ('2013-01-01'), ('2013-01-02'), ('2013-01-03'), 
    ('2014-03-01'), ('2014-03-02'), ('2014-03-03'), 
    ('2014-10-01'), ('2014-10-01'), ('2014-10-01'), 
    ('2014-10-01'), ('2014-10-01'); 

CREATE VIEW V 
AS 
    SELECT YEAR(`Date`) AS `Year`, 
      COUNT(CASE WHEN MONTH(`Date`) = 1 THEN 1 END) AS `Jan`, 
      COUNT(CASE WHEN MONTH(`Date`) = 2 THEN 1 END) AS `Feb`, 
      COUNT(CASE WHEN MONTH(`Date`) = 3 THEN 1 END) AS `Mar`, 
      COUNT(CASE WHEN MONTH(`Date`) = 4 THEN 1 END) AS `Apr`, 
      COUNT(CASE WHEN MONTH(`Date`) = 5 THEN 1 END) AS `May`, 
      COUNT(CASE WHEN MONTH(`Date`) = 6 THEN 1 END) AS `Jun`, 
      COUNT(CASE WHEN MONTH(`Date`) = 7 THEN 1 END) AS `Jul`, 
      COUNT(CASE WHEN MONTH(`Date`) = 8 THEN 1 END) AS `Aug`, 
      COUNT(CASE WHEN MONTH(`Date`) = 9 THEN 1 END) AS `Sep`, 
      COUNT(CASE WHEN MONTH(`Date`) = 10 THEN 1 END) AS `Oct`, 
      COUNT(CASE WHEN MONTH(`Date`) = 11 THEN 1 END) AS `Nov`, 
      COUNT(CASE WHEN MONTH(`Date`) = 12 THEN 1 END) AS `Dec` 
    FROM T 
    GROUP BY YEAR(`Date`); 

Example on SQL Fiddle

+0

0 레코드가있는 달이 표시 될지 잘 모르겠습니다. 카운트 대신 sum (case 등 다음에 1 else 0 end)을 사용할 것입니다. –

+0

@DanBracuk 두 가지 방법이 똑같이 작동하므로 차이가 없습니다. (바이올린을 확인하십시오. 질문에 정확히 표시된대로 표시됩니다.) 단순히 개인적인 취향입니다. 나는 개인적으로'COUNT'를 원할 때'COUNT'를 사용하고 SUM을 원할 때'SUM'을 사용하는 것이 더 합리적이라고 생각합니다. – GarethD

+0

에 대한 자세한 내용은'COUNT (사례 ...)'대 SUM (사례 ...)'http://dba.stackexchange.com/q/27558/7257 – GarethD