2010-03-11 2 views
9

주문 모음이있는 테이블이 있습니다. 필드는 다음과 같습니다TSQL : 주별 고객 주문 그룹화

  • customerName (텍스트)
  • DateOfOrder (날짜).

고객 당 주당 총 주문 수를 표시하고 싶습니다. 나는 그것이 다음과 같이 보이도록 매주 금요일에 준비하고 싶습니다.

all dates follow mm/dd/yyyy 

"bobs pizza", 3/5/2010, 10 
"the phone co",3/5/2010,5 
"bobs pizza", 3/12/2010, 3 
"the phone co",3/12/2010,11 

누군가 이걸 어떻게하는지 보여 주시겠습니까?

감사합니다.

답변

15

쉽게 그룹화 할 수있는 입력란을 만드십시오.

SELECT COUNT(OrderID), WeekStart 
FROM 
(
SELECT *, 
    dateadd(week, datediff(day,'20000107',yourDate)/7, '20000107') AS WeekStart 
FROM Orders 
) o 
GROUP BY WeekStart; 

20000107은 알려진 금요일입니다.

2

이것은 완전한 주문이 아니지만 주 #을 줄 것입니다. 그룹화를 추가하기 만하면됩니다.

SELECT 
Cast(DatePart(YEAR, dateadd(month, datediff(month, 0, DateOfOrder),0)) 
    AS nvarchar(20)) 
+ ' ' 
+ RIGHT('0' + Cast(DatePart(WK, DateOfOrder) AS nvarchar(20)), 2) 
,CustomerName 
FROM Orders 
2

그냥 내가 금요일 날짜 뭔가를 놓친 경우 이것은

DECLARE @Table TABLE(
     customerName VARCHAR(50), 
     DateOfOrder DATETIME, 
     Quantity FLOAT 
     ) 

INSERT INTO @Table SELECT 'bobs pizza', '1/5/2010', 10  
INSERT INTO @Table SELECT 'bobs pizza', '3/5/2010', 10 
INSERT INTO @Table SELECT 'bobs pizza', '3/4/2010', 10 
INSERT INTO @Table SELECT 'the phone co','3/5/2010',5 
INSERT INTO @Table SELECT 'bobs pizza', '3/12/2010', 3 
INSERT INTO @Table SELECT 'the phone co','3/12/2010',11 
INSERT INTO @Table SELECT 'the phone co','3/13/2010',11 
INSERT INTO @Table SELECT 'the phone co','3/15/2010',11 


SELECT DateFirday, 
     DATENAME(dw, DateFirday), 
     SUM(Quantity) Total 
FROM (
      SELECT *, 
        DATEADD(week, DATEPART(WEEK, DateOfOrder) - 1, CAST('01 Jan' + CAST(DATEPART(year,DateOfOrder) AS VARCHAR(4)) AS DATETIME)) DateFirday 
      FROM @Table 
     ) sub 
GROUP BY DateFirday 

출력

DateFirday            Total 
----------------------- ------------------------------ ---------------------- 
2010-01-08 00:00:00.000 Friday       10 
2010-03-05 00:00:00.000 Friday       25 
2010-03-12 00:00:00.000 Friday       25 
2010-03-19 00:00:00.000 Friday       11 

갈 줄려고, 나를 이렇게 내가 모습을 가질 수 있습니다 알려 주시기 바랍니다.

1

이 한 시간 구성 요소가 없기 때문에 작동합니다

SELECT  DateOfOrder - DATEPART(dw, DateOfOrder) + 7 AS weekEndingDate, customerName, COUNT(*) AS totalOrders 
FROM   Orders 
GROUP BY DateOfOrder - DATEPART(dw, DateOfOrder) + 7, customerName 

이 DATEFIRST가 변경되지 않았 음을 가정합니다. 뺄셈은 토요일 previos로 돌아가고 +7은 금요일에옵니다. 시간 구성 요소가있는 경우

, 그것을 없애기 표준 기술 중 하나를 사용 SS2008

CAST(DateOfOrder AS date) - DATEPART(dw, DateOfOrder) + 7 
2

를 들어,

DATEADD(day, DATEDIFF(day, 0, DateOfOrder), 0) - DATEPART(dw, DateOfOrder) + 7 

CAST(FLOOR(CAST(DateOfOrder as FLOAT)) as DATETIME) - DATEPART(dw, DateOfOrder) + 7 

또는 내가하지 않았다 이후이 추가 것이라고 생각 내가 할 수있을뿐만 아니라 기존의 최고의 대답을 좋아합니다. 평일을 빼고 원하는 날에 다시 추가합니다. 다른 요일을 원한다면 6을 조정하십시오 (또는 DATEFIRST가 내가 수집 한 것과 다르게 설정되는 경우).

SELECT Friday, COUNT(CustomerName) 
FROM 
(
SELECT *, 
    CAST(DATEADD(d, 6 - DATEPART(dw,DateOfOrder), DateOfOrder) AS date) AS Friday 
FROM Orders 
) o 
GROUP BY Friday;