2010-03-11 9 views
9

मेरे पास ऑर्डर संग्रह के साथ एक टेबल है। क्षेत्र हैं:टीएसक्यूएल: सप्ताह के अनुसार ग्राहक आदेश समूहित करना

  • 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 नहीं बदला गया है। घटाव शनिवार को प्रीवियोस में वापस आ जाएगा, फिर + 7 शुक्रवार को हो जाता है।

अगर वहाँ एक समय घटक है, मानक तकनीकों में से एक यह बंद पट्टी का उपयोग करें:

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

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

या, SS2008

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

के लिए मैं के बाद से मैंने नहीं किया मैं इस जोड़ना होगा सोचा मौजूदा सर्वोत्तम उत्तर के साथ-साथ मैं कर सकता था। यह सिर्फ सप्ताह के दिन घटाता है और फिर वांछित दिन में वापस जोड़ता है। यदि आप सप्ताह के एक अलग दिन चाहते हैं (या यदि आपका DATEFIRST अलग-अलग सेट है, तो मैं जो भी एकत्र करता हूं) 6 समायोजित करें।

SELECT Friday, COUNT(CustomerName) 
FROM 
(
SELECT *, 
    CAST(DATEADD(d, 6 - DATEPART(dw,DateOfOrder), DateOfOrder) AS date) AS Friday 
FROM Orders 
) o 
GROUP BY Friday; 
संबंधित मुद्दे