2008-11-30 21 views
14

मैं एक एसक्यूएल 2005 मेज के लिए शो के आदेश, के यह आदेश फोन, प्रारूप में करते हैं:एसक्यूएल समूह, प्रत्येक दिन

OrderID, OrderDate, OrderAmount 
1,  25/11/2008, 10 
2,  25/11/2008, 2 
3,  30/1002008, 5 

तो मैं एक रिपोर्ट तालिका प्रत्येक पर आदेश दिया राशि दिखा उत्पादन की जरूरत है पिछले 7 दिनों में दिन:

Day,  OrderCount, OrderAmount 
25/11/2008, 2,   12 
26/11/2008, 0,   0 
27/11/2008, 0,   0 
28/11/2008, 0,   0 
29/11/2008, 0,   0 
30/11/2008, 1,   5 

SQL क्वेरी कि आम तौर पर इस का उत्पादन होगा:

select count(*), sum(OrderAmount) 
    from Orders 
    where OrderDate>getdate()-7 
    group by datepart(day,OrderDate) 

में कोई समस्या है कि यह दिन जहां कोई आदेश देखते हैं छोड़ देगा:

Day,  OrderCount, OrderAmount 
25/11/2008, 2,   12 
30/11/2008, 1,   5 

आम तौर पर मैं इस एक संख्या तालिका और बाहरी का उपयोग कर ठीक हैं वहाँ पंक्तियों के खिलाफ में शामिल होने, लेकिन मैं वास्तव में इस के लिए एक सरल या अधिक कुशल समाधान के लिए देख रहा हूँ । ऐसा लगता है कि एक रिपोर्ट पूछताछ के लिए ऐसी सामान्य आवश्यकता है कि कुछ सुरुचिपूर्ण समाधान पहले से ही इसके लिए उपलब्ध होना चाहिए।

तो: 1. इस परिणाम मिलान तालिकाओं का उपयोग किए बिना एक साधारण क्वेरी से प्राप्त किया जा सकता है?

और 2. यदि नहीं, तो क्या हम फ्लाई पर इस टैली टेबल (विश्वसनीय रूप से) बना सकते हैं (मैं सीटीई का उपयोग करके एक टैली टेबल बना सकता हूं लेकिन रिकर्स स्टैक मुझे 100 पंक्तियों तक सीमित करता है)?

+0

आपका उदाहरण का चयन तारीख की जानकारी अस्वीकार करते हैं। –

+5

दिन के अनुसार एसक्यूएल समूह, रात तक अपराध लड़ने वाली टीम –

+0

इस लिंक में दिन के दिन-दर-दिन - दिन के दिन - दिन के दिन एक्सपल्स के साथ विस्तार से डेटा एकत्र करने की पूरी जानकारी है। http://sqlserverlearner.com/2012/group-by-day-with-examples –

उत्तर

0

SQL सर्वर अस्थायी तालिकाओं को कैसे प्रबंधित करता है, इस पर निर्भर करता है कि आप एक अस्थायी तालिका बनाने के लिए आसानी से व्यवस्थित कर सकते हैं और 7 (या वह 8 थी?) तिथियों के साथ इसे पॉप्युलेट कर सकते हैं। आप इसका उपयोग तब कर सकते हैं आपकी टैली टेबल एक क्लीनर तरीका नहीं है जिसे मैं जानता हूं; आप केवल उस तालिका का चयन कर सकते हैं जो किसी तालिका में मौजूद है या जिसे किसी तालिका या तालिका के सेट में मौजूद डेटा से लिया जा सकता है। यदि ऑर्डर तालिका में दिनांकों का प्रतिनिधित्व नहीं किया गया है, तो आप ऑर्डर तालिका से उन तिथियों का चयन नहीं कर सकते हैं।

10

एसक्यूएल तारीखों को "छोड़ना" नहीं है ... क्योंकि प्रश्न डेटा के खिलाफ चलते हैं जो वास्तव में तालिका में हैं। इसलिए, यदि आपके पास 14 जनवरी के लिए तालिका में कोई DATE नहीं है, तो SQL आपको परिणाम क्यों दिखाएगा :)

आपको एक temp तालिका बनाने और इसमें शामिल होने की आवश्यकता है।

CREATE TABLE #MyDates (TargetDate DATETIME) 
INSERT INTO #MyDates VALUES CONVERT(DATETIME, CONVERT(VARCHAR, GETDATE() - 0, 101)) 
INSERT INTO #MyDates VALUES CONVERT(DATETIME, CONVERT(VARCHAR, GETDATE() - 1, 101)) 
INSERT INTO #MyDates VALUES CONVERT(DATETIME, CONVERT(VARCHAR, GETDATE() - 2, 101)) 
INSERT INTO #MyDates VALUES CONVERT(DATETIME, CONVERT(VARCHAR, GETDATE() - 3, 101)) 
INSERT INTO #MyDates VALUES CONVERT(DATETIME, CONVERT(VARCHAR, GETDATE() - 4, 101)) 
INSERT INTO #MyDates VALUES CONVERT(DATETIME, CONVERT(VARCHAR, GETDATE() - 5, 101)) 
INSERT INTO #MyDates VALUES CONVERT(DATETIME, CONVERT(VARCHAR, GETDATE() - 6, 101)) 
INSERT INTO #MyDates VALUES CONVERT(DATETIME, CONVERT(VARCHAR, GETDATE() - 7, 101)) 

SELECT CONVERT(VARCHAR, TargetDate, 101) AS Date, COUNT(*) AS OrderCount 
FROM dbo.Orders INNER JOIN #MyDates ON Orders.Date = #MyDates.TargetDate 
GROUP BY blah blah blah (you know the rest) 

ये लीजिए!

0

आपको अन्य प्रश्नों में अक्सर इस तिथि तालिका का उपयोग करना चाहते हैं के बाद से, मैं तुम्हें यह एक स्थायी तालिका बनाने के लिए और साल में एक बार नए साल की तारीखों को जोड़ने के लिए एक नौकरी बनाने की सलाह।

+0

या इसे 20 साल की तिथियों के साथ एक बार भरें। मामूली आकार, और नौकरी के बारे में चिंता क्यों करें। अगले साल यह नहीं चलेगा और वह चलेगा ..... – dkretz

1

आप मान शून्य को देखने के लिए की तुलना में निम्न क्वेरी डाल चाहते हैं:

select count(*), sum(OrderAmount) 
from Orders 
where OrderDate>getdate()-7 
    and sum(OrderAmount) > 0 or sum(OrderAmount) = 0 
group by datepart(day,OrderDate) 
2

मैं एक ही समस्या थी और यह है कि कैसे मैं इसे हल:

SELECT datename(DW,nDays) TimelineDays, 
    Convert(varchar(10), nDays, 101) TimelineDate, 
    ISNULL(SUM(Counter),0) Totals 
FROM (Select GETDATE() AS nDays 
    union Select GETDATE()-1 
    union Select GETDATE()-2 
    union Select GETDATE()-3 
    union Select GETDATE()-4 
    union Select GETDATE()-5 
    union Select GETDATE()-6) AS tDays 

Left Join (Select * From tHistory Where Account = 1000) AS History 
      on (DATEPART(year,nDays) + DATEPART(MONTH,nDays) + DATEPART(day,nDays)) = 
      (DATEPART(year,RecordDate) + DATEPART(MONTH,RecordDate) + DATEPART(day,RecordDate)) 
GROUP BY nDays 
ORDER BY nDays DESC 

ouput है:

TimelineDays, TimelineDate,  Totals 

Tuesday   10/26/2010  0 
Monday   10/25/2010  6 
Sunday   10/24/2010  3 
Saturday  10/23/2010  2 
Friday   10/22/2010  0 
Thursday  10/21/2010  0 
Wednesday  10/20/2010  0 
0
CREATE PROCEDURE [dbo].[sp_Myforeach_Date] 
    -- Add the parameters for the stored procedure here 
    @SatrtDate as DateTime, 
    @EndDate as dateTime, 
    @DatePart as varchar(2), 
    @OutPutFormat as int 
AS 
BEGIN 
    -- SET NOCOUNT ON added to prevent extra result sets from 
    -- interfering with SELECT statements. 
    Declare @DateList Table 
    (Date varchar(50)) 

    WHILE @SatrtDate<= @EndDate 
    BEGIN 
    INSERT @DateList (Date) values(Convert(varchar,@SatrtDate,@OutPutFormat)) 
    IF Upper(@DatePart)='DD' 
    SET @SatrtDate= DateAdd(dd,1,@SatrtDate) 
    IF Upper(@DatePart)='MM' 
    SET @SatrtDate= DateAdd(mm,1,@SatrtDate) 
    IF Upper(@DatePart)='YY' 
    SET @SatrtDate= DateAdd(yy,1,@SatrtDate) 
    END 
    SELECT * FROM @DateList 
END 

बस इस कोड डाल दिया और इस तरह से सपा फोन

exec sp_Myforeach_Date @SatrtDate='03 Jan 2010',@EndDate='03 Mar 2010',@DatePart='dd',@OutPutFormat=106 

धन्यवाद * Suvabrata Roy आईसीआरए ऑनलाइन लिमिटेड कोलकाता *

संबंधित मुद्दे