2011-06-12 6 views
3

여기에 제가 가진 문제점이 있습니다. 예를 들면 다음과 같습니다.문제 별 SQL 그룹

DateTime    Campaign 
2011-06-01 08:55:00 Campaign1 
2011-06-01 08:56:00 Campaign1 
2011-06-01 08:57:00 Campaign2 
2011-06-01 08:58:00 Campaign1 
2011-06-01 08:59:00 Campaign1 

동일한 캠페인 인 경우에만 캠페인별로 그룹화하고 싶습니다. 내가 예상 한 결과는 다음과 같습니다 나는 캠페인, 내가

DateTime    Campaign Count 
2011-06-01 08:55:00 Campaign1  4 
2011-06-01 08:57:00 Campaign2  1 

에서

Select *, Count(Campaign) as Count from myTable group by Campaign 

결과 CAMPAIGN1 만 한 줄을 얻을 그룹마다

DateTime    Campaign Count 
2011-06-01 08:55:00 Campaign1  2 
2011-06-01 08:57:00 Campaign2  1 
2011-06-01 08:58:00 Campaign1  2 

당신이 어떤 생각을 가지고 있습니까 원하는 결과를 얻는 방법은 무엇입니까?

감사합니다.

+0

테이블 구조를 게시하십시오. 캠페인 열이 아니라면 여기에서 그룹화하려는 대상을 결정하기가 어렵습니다. –

+0

두 열 모두에 관한 내용입니다. 이 테이블은 DateTime에 의해 정렬됩니다. 나는 그 그룹이 그날의 시간 순서를 존중하기를 바랍니다. 따라서 Campaing2가 충족 될 때까지 Campaign1을 그룹화합니다. 그것은 Campaign2를 함께 그룹화합니다. 다른 Campaign1이있을 때보 다 그룹으로 모으기를 원합니다.죄송합니다 충분히 명확하지 않은 경우 – Mathieu

답변

4

표준 ANSI SQL 문에서 찾고있는 것을 수행하는 방법이 없습니다. 스토어드 프로 시저 (Stored Procedure) 또는 커서 사용에 관해 위에서 언급 한 내용을 수행 할 수 있지만 커서를 사용하여 T-SQL 또는 PL/SQL에 명령문을 작성하여 시작 시간 및 카운트의 시작 번호를 결정할 수도 있습니다. T-SQL (마이크로 소프트 SQL 서버) :

USE [<database name here>] 
DECLARE @tbl_result TABLE (Result_DT DATETIME, Campaign VARCHAR(25), unit_count int); 
DECLARE @start_dt DATETIME, 
     @current_campaign VARCHAR(25), --This can be any length needed - if your campaigns are over 25 chars long 
     @record_dt DATETIME, 
     @campaign VARCHAR(25), 
     @cur_records CURSOR, 
     @Record_Count INT; 
SET @current_campaign = 'Start' 
SET @cur_records = CURSOR 
FOR SELECT DateTime, Campaign FROM myTable order by 1,2 

OPEN @cur_records 

FETCH NEXT FROM @cur_records INTO @record_dt, @campaign 
WHILE @@FETCH_STATUS = 0 
    BEGIN 
     -- CHECK THE record to the Current Campaign for grouping 
     IF @campaign <> @current_campaign 
      BEGIN 
       If @current_campaign <> 'Start' 
       BEGIN 
        INSERT INTO @tbl_result 
        VALUES (@start_dt, @current_campaign, @Record_Count) 
       END 
      SET @current_campaign = @campaign 
      SET @start_dt = @record_dt 
      SET @Record_Count = 1 
      END 
     ELSE 
      BEGIN 
       SET @Record_Count = @Record_Count + 1 
      END 
    END 
    INSERT INTO @tbl_result -- Inserting the last of the Records 
    VALUES (@start_dt, @current_campaign, @Record_Count) 
-- Now to display the results 
SELECT Result_DT, Campaign, unit_count FROM @tbl_result order by 1, 2 
이제

이 오류 아웃 경우에 저를 용서 - 당신이 마이크로 소프트 박스

+0

Awsome, 아직 T-SQL을 사용해 본적이 없습니다. 들어가기 시작했습니다. 시간과 소중한 도움에 감사드립니다! – Mathieu

0

당신은과 같이, 다음, 날짜별로 그룹화 할하는 캠페인을 보인다 : 이것은 SQL에서 해결하기 위해 매우 열심히하고 다른 방법으로 해결하기 정말 쉬운 문제가

SELECT DateTime, Campaign, Count(Campaign) as Count 
FROM myTable 
GROUP BY DateTime, Campaign 
+1

이것은 제대로 작동하지 않습니다 - 나는 그가 캠페인과 날짜가 아닌 지속적인 캠페인을 원한다고 생각합니다. – dfb

+0

DateTime은 결코 동일하지 않으므로 아무 것도 그룹화하지 않습니다. 그래도 고마워! – Mathieu

2

. 나는 이것이 단일 원시 SQL 질의로 수행 될 수 있다고 생각조차하지 않는다. 문제는 그룹 by가 개별 열 속성의 집계가 아니지만 다른 열에도 종속된다는 것입니다. 당신은 커서를 사용하여 sproc을 작성하는 것보다 더 좋을 것입니다.

0

나는이 ISN을 알고 '인 경우 필요하지만의 기본 구조이어야한다 당신이 요구 한 것이지만 "캠페인"열이 고유하지 않으면 자동 증가 데이터 유형과 같이 각 캠페인에 대해 고유 한 식별자가있는 다른 테이블을 추가합니다. 이렇게하면 동일한 이름의 캠페인이 두 개있는 경우 중요하지 않습니다.

FirstTable

UniqueCampaign  CampaignName 
1     Campaign1 
2     Campaign2 
3     Campaign1 

SecondTable 그런

DateTime    UniqueCampaign  
2011-06-01 08:55:00 1 
2011-06-01 08:56:00 1 
2011-06-01 08:57:00 2 
2011-06-01 08:58:00 3 
2011-06-01 08:59:00 3 

쉽게 단지 등으로 그룹을 사용할 수

SELECT MIN(DateTime) [DateTime], T1.UniqueCampaign, COUNT(*) CampaignCount 
FROM SecondTable T1 
INNER JOIN FirstTable T2 
    ON T1.UniqueCampaign = T2.UniqueCampaign 
Group By T1.UniqueCampaign 

당신에게

DateTime     UniqueCampaign CampaignCount 
2011-06-01 08:55:00.000  1    2 
2011-06-01 08:57:00.000  2    1 
2011-06-01 08:58:00.000  3    2 
을 줄 것이다
+0

답장을 보내 주셔서 감사합니다. 반면 캠페인 1은 하나의 캠페인 일뿐입니다. 그렇지 않다면 아무런 문제가되지 않습니다! – Mathieu