2013-12-19 4 views
1

저는 SQL에 익숙하지 않고 이런 식으로 일부 데이터를 추출하려고합니다. 그러나 현재 나는 한 번에 하나의 진술을 실행하고 그들을 복사하여 탁월합니다. 이 모든 것을 함께 수행 할 수있는 방법이 있습니까? 레벨은 각 명령문에 대해 동일하지만 계수 (ID)가 다를 수 있습니다. 레벨에 데이터가없는 날도 있습니다.복수의 SQL 문을 열로 결합하기

select 
    count(ID), level 
from table1 
where createat >= "2013-11-22 00:00:00" and createat <= "2013-11-22 23:59:59" 
group by level; 

select 
    count(ID), level 
from table1 
where createat >="2013-11-23 00:00:00" and createat <= "2013-11-23 23:59:59" 
group by level; 

select 
    count(ID), level 
from table1 
where createat >= "2013-11-24 00:00:00" and createat <= "2013-11-24 23:59:59" 
group by level; 

도움 주셔서 감사합니다! 나는 이것들을 쓰는 방법에 대해 더 많이 배우기를 바라고있다.

+2

1) 당신이 당신의 날짜 열에서 월의 일을 추출 할 날짜 함수를 사용하여 2)를 사용하여 데이터베이스의 종류를 제공, 원하는 경우 검색어를 쉽게 사용하고 그룹화하려면이 옵션을 사용하십시오. –

답변

1

당신이 게시 된 쿼리에 대한 간단한 편집은 다음과 같습니다 그러나

select count(ID), level 
from table1 
where createat >= "2013-11-22 00:00:00" and createat <= "2013-11-22 23:59:59" 
group by level 
union 
select count(ID), level 
from table1 
where createat >="2013-11-23 00:00:00" and createat <= "2013-11-23 23:59:59" 
group by level 
union 
select count(ID), level 
from table1 
where createat >= "2013-11-24 00:00:00" and createat <= "2013-11-24 23:59:59" 
group by level 

당신은 다음과 같은 쿼리를 사용할 수있는 매일의 수, 레벨 값과 날짜를 얻으려고 노력하는 경우 :

SELECT COUNT(*), level, CAST(createat AS DATE) 
FROM table1 
GROUP BY level, CAST(createat AS DATE) 
2
SELECT 
    level, 
    COUNT(CASE WHEN createat>='2013-11-22' and createat<'2013-11-23' THEN id ELSE NULL END) AS day_1_count, 
    COUNT(CASE WHEN createat>='2013-11-23' and createat<'2013-11-24' THEN id ELSE NULL END) AS day_2_count, 
    COUNT(CASE WHEN createat>='2013-11-24' and createat<'2013-11-25' THEN id ELSE NULL END) AS day_3_count 
FROM 
    table1 
GROUP BY 
    level 
WHERE 
    createat>='2013-11-22' and createat<'2013-11-25' 

비록 하드 코딩하지 않고 원하는 날짜로 테이블에 가입하는 것이 더 효과적 일 수 있습니다.

또한 SQL은 고정 된 수의 열에서 작동하며, 3 일 동안 하나의 쿼리를 원한 다음 5 일 동안 다시 사용하려는 경우에는 작동하지 않습니다. 이를 위해서는 행당 하나의 결과로 유지해야합니다.

2

이 시도 :

SELECT t.level, SUM(CASE WHEN DATE(createat) = '2013-11-22' THEN 1 ELSE 0 END) AS day1, 
     SUM(CASE WHEN DATE(createat) = '2013-11-23' THEN 1 ELSE 0 END) AS day2, 
     SUM(CASE WHEN DATE(createat) = '2013-11-24' THEN 1 ELSE 0 END) AS day3 
FROM table1 t 
WHERE DATE(t.createat) >= "2013-11-22" AND DATE(t.createat) <= "2013-11-24" 
GROUP BY t.level; 

또는

SELECT t.level, SUM(CASE WHEN t.createat >= "2013-11-22 00:00:00" AND t.createat <= "2013-11-22 23:59:59" THEN 1 ELSE 0 END) AS day1, 
     SUM(CASE WHEN t.createat >= "2013-11-23 00:00:00" AND t.createat <= "2013-11-23 23:59:59" THEN 1 ELSE 0 END) AS day2, 
     SUM(CASE WHEN t.createat >= "2013-11-24 00:00:00" AND t.createat <= "2013-11-24 23:59:59" THEN 1 ELSE 0 END) AS day3 
FROM table1 t 
WHERE t.createat >= "2013-11-22 00:00:00" AND t.createat <= "2013-11-24 23:59:59" 
GROUP BY t.level;