2014-02-28 4 views
0

그래서 판매 주문 수를 제공하고 이전 날짜 범위와 비교할 보고서를 만들려고합니다. 불행히도 이러한 각각의 계산이 동일한 테이블 열에 대해 실행될 때 결과를 반환하는 방법에 대해서는 확신 할 수 없습니다.동일한 데이터베이스 열에 대해 단일 결과 집합으로 여러 쿼리 반환

이상적으로 내 출력이 NULL을 포함하여, 다음과 같이 보일 것입니다 것은

partner Today LastYear TwoYear 
------- ------ -------- -------- 
zzz  10  15   4 
yyy  2     4 
xxx  3  1   2 

내가 아래로 기본적인 생각을 가지고 값 :

DECLARE @currentDay DATETIME 
SET @currentDay = DATEDIFF(day,0,GETDATE()) -- Gives it 00:00:00.000 for time 

-- Todays orders 
SELECT count(s.po_id) as 'Orders Today',c.tp_name 
FROM [EDI_001].[dbo].[303v850h] as s 
join [EDI_001].[dbo].[Trade] as c 
on s.TP_PartID = c.TP_PartID 
where s.ExportDate < @currentDay AND 
     s.ExportDate > DATEADD(day,-1,@currentDay) 
group by c.tp_name 
order by c.tp_name; 

-- Last Years Day's orders 
SELECT count(s.po_id) as 'Orders Today',c.tp_name 
FROM [EDI_001].[dbo].[303v850h] as s 
join [EDI_001].[dbo].[Trade] as c 
on s.TP_PartID = c.TP_PartID 
where s.ExportDate < DATEADD(year,-1,@currentDay) AND 
     s.ExportDate > DATEADD(year, -1,DATEADD(day,-1,@currentDay)) 
group by c.tp_name 
order by c.tp_name; 

내가 가서 당신이 할 수있는,이 중단됩니다 쿼리는 where 절에서 날짜 범위를 변경하는 것과 거의 동일합니다. 두 개의 쿼리를 단일 결과 집합으로 결합하는 방법은 잘 모릅니다. 또한, 조인은 어느 쿼리에서나 빈 집합을 반환하지 않습니다. 나는 현재 조인을 사용하지 않을 것이지만, 왼쪽 외부 조인과 다른 결과를 보이지는 않는다는 것을 알고 있습니다. 그러나 현실적으로 한 번에 하나의 문제와 첫 번째 단계는 단일 결과 집합을 얻는 것입니다. 어떤 도움이라도 대단히 감사하겠습니다.

답변

0
DECLARE @currentDay DATETIME 
SET  @currentDay = DATEDIFF(day,0,GETDATE()) -- Gives it 00:00:00.000 for time 

SELECT Sum(
      CASE 
      WHEN s.ExportDate Between DATEADD(day,-1,@currentDay) AND @currentDay 
      THEN 1 
      ELSE 0 
      END 
      ) As Today, 
     Sum(
      CASE 
      WHEN s.ExportDate Between DATEADD(year, -1,DATEADD(day,-1,@currentDay)) AND DATEADD(year,-1,@currentDay) 
      THEN 1 
      ELSE 0 
      END 
      ) As LastYear, 
     Sum(
      CASE 
      WHEN s.ExportDate Between DATEADD(year, -2,DATEADD(day,-1,@currentDay)) AND DATEADD(year,-2,@currentDay) 
      THEN 1 
      ELSE 0 
      END 
      ) As TwoYear, 
     c.tp_name 
FROM [EDI_001].[dbo].[303v850h] as s 
JOIN [EDI_001].[dbo].[Trade] as c 
     on s.TP_PartID = c.TP_PartID 
GROUP BY c.tp_name 
ORDER BY c.tp_name; 
+0

이 질문은'>'와'<'를 사용하기 때문에 BETWEEN에 포함되어 있기 때문에 경계에서 자정에 레코드가 있다면 다른 결과가 나옵니다. 또한's.po_id'가 null 인 경우 다른 카운트를 제공합니다. – GarethD

0

당신은 조건부 집계 사용할 수 있습니다 : 당신이 경우에만 기록을 계산합니다 그래서 그래서

SELECT c.tp_name, 
     Today = COUNT(CASE WHEN s.ExportDate > DATEADD(DAY,-1,@currentDay) THEN s.po_id END), 
     LastYear = COUNT(CASE WHEN s.ExportDate > DATEADD(YEAR,-1,@currentDay) 
          AND s.ExportDate < DATEADD(YEAR, -1,DATEADD(DAY, -1, @currentDay))THEN s.po_id END), 
     TwoYear = COUNT(CASE WHEN s.ExportDate > DATEADD(YEAR,-2, @currentDay) 
          AND s.ExportDate < DATEADD(YEAR, -2, DATEADD(DAY, -1, @currentDay))THEN s.po_id END), 
FROM [EDI_001].[dbo].[303v850h] as s 
     JOIN [EDI_001].[dbo].[Trade] as c 
      ON s.TP_PartID = c.TP_PartID 
WHERE s.ExportDate < @currentDay AND 
     s.ExportDate > DATEADD(YEAR, -2, DATEADD(DAY, -1, @currentDay)) 
GROUP BY c.tp_name 
ORDER BY c.tp_name; 

을 당신은 본질적으로하여 COUNT 내부의 CASE 문에 WHERE 절을 각각 이동하여 기준이 충족된다.

+0

일부 작업이 필요합니다. 귀하의 where criteria (조건)은 여전히 ​​지난 해로 그 기준을 제한하고 있으며, 귀하의 집계는 귀하에게 단 하루 카운트를주지 않습니다. –

+0

좋은 지적. 나는 그 질문을 잘못 이해했다. 나는 지금 그것을 바로 잡았다. – GarethD

+0

데이터 세트가 2 년이 아닌 2 년이되기 때문에 여전히 세 번째 열을 자르고 있습니다. –

관련 문제