2017-03-09 4 views
6

मैं इस तालिका DDL है:मैं SQL के साथ डेटा की संचयी रिपोर्ट कैसे बना सकता हूं?

CREATE TABLE [dbo].[Audit] (
    [AuditId] INT    IDENTITY (1, 1) NOT NULL, 
    [Entity] INT    NOT NULL, 
    [Action] INT    NOT NULL, 
    [Id]  UNIQUEIDENTIFIER NULL, 
    CONSTRAINT [PK_Audit] PRIMARY KEY CLUSTERED ([AuditId] ASC) 
); 

अद्यतन - मुझे याद आ एसक्यूएल यहाँ गयी।

select [col1] = CONVERT(VARCHAR(10), DATEADD(HOUR, 8, a.date), 101) , 
     [Col2] = convert(varchar, count(*)) 
from Audit a 
group by CONVERT(VARCHAR(10), DATEADD(HOUR, 8, a.date), 101) 
order by CONVERT(VARCHAR(10), DATEADD(HOUR, 8, a.date), 101) desc 

उत्पादन इस तरह दिखता है:

col1  Col2 
03/05/2017 1 
03/04/2017 20 
03/03/2017 10 
03/02/2017 5 
03/01/2017 10 

कि

मैं क्या बारे में क्षमा करें यह एसक्यूएल है कि मुझे पता चलेगा कि कितना गतिविधि प्रत्येक दिन वहाँ था का उपयोग कर एक एसक्यूएल रिपोर्ट बनाने था अब मुझे एक एसक्यूएल चयन बनाने की ज़रूरत है जो मुझे एक संचयी मूल्य दिखाती है, न कि गिनती। इसलिए मैं एसक्यूएल कि clould एक रिपोर्ट है कि यह दिखाएगा बनाने की जरूरत है इस

col1  Col2 
03/05/2017 46 
03/04/2017 45 
03/03/2017 25 
03/02/2017 15 
03/01/2017 10 

किसी को कैसे मैं एक रिपोर्ट के इस प्रकार बनाने के लिए मेरी एसक्यूएल संशोधित कर सकते हैं के बारे में कोई विचार है?

ध्यान दें कि मैं वास्तव में एक कमांड समाधान की तलाश में हूं क्योंकि इसे .NET फ्रेमवर्क से निष्पादित किया गया है और यदि समाधान में कई कमांड हैं तो मुझे लगता है कि मुझे इसे किसी संग्रहीत प्रक्रिया में कैसे रखा जाए, इसे बाहर करने की आवश्यकता होगी।

+0

उत्पादन एक चयन * या? से है पहली पंक्ति में शुरू होने वाले संचयी योग से आपको 46 कैसे प्राप्त हुए? – scsimon

+0

यह एक रनिंग कुल है। इसका समाधान आप जिस SQL ​​सर्वर का उपयोग कर रहे हैं उसके संस्करण पर निर्भर करता है। इस साइट पर चलने वाले कुल योग के दर्जनों और दर्जन उदाहरण हैं। –

+0

हाय @ ऐनी, हम आपको सही परिणाम प्राप्त करने के लिए अपने एसक्यूएल को संशोधित करने में मदद करना पसंद करेंगे। दुर्भाग्यवश, आपने अपना SQL कोड प्रदान नहीं किया है, इसलिए हम नहीं जानते कि कौन से संशोधनों का सुझाव देना है। – KindaTechy

उत्तर

5

आप विंडो कार्य Sum() Over

Select col1 = convert(varchar(10),cast(dateadd(HOUR, 8, a.date) as date),101) 
     ,col2 = sum(count(*)) over (Order by cast(dateadd(HOUR, 8, a.date) as date)) 
From Audit a 
Group by cast(dateadd(HOUR, 8, a.date) as date) 
Order By cast(dateadd(HOUR, 8, a.date) as date) Desc 

रिटर्न

col1  Col2 
03/05/2017 46 
03/04/2017 45 
03/03/2017 25 
03/02/2017 15 
03/01/2017 10 
+0

मुझे खेद है कि मुझे यह उल्लेख करने से चूक गया कि मेरे पास पहले से ही एक SQL चयन है जिसे मैं योग रिपोर्ट बनाने के लिए संशोधित करना चाहता हूं। आपका सुझाव अच्छा है लेकिन क्या ऐसा कोई तरीका है कि इसे मेरे मूल चयन में जोड़ा जा सकता है जिसे अब प्रश्न में जोड़ा गया है। धन्यवाद –

+0

@ एनी अद्यतन उत्तर –

+2

[किक करने के लिए बुरी आदतें: तारीख/समय के संचालन के साथ शॉर्टेंड का उपयोग करना - हारून बर्ट्रैंड] (http://sqlblog.com/blogs/aaron_bertrand/archive/2011/09/20/bad-habits- टू-किक-यूज-शॉर्ट-टू-डेट-टाइम-ऑपरेशंस.एएसपीएक्स) – SqlZim

2

आप नीचे कुछ ऐसा करने का प्रयास कर सकते हैं।

IF OBJECT_ID('tempdb..#CumulativeSum') IS NOT NULL 
    DROP TABLE #CumulativeSum 

SELECT t1.col1, t1.col2 AS col2Actual, SUM(t2.col2) AS col2 
INTO #CumulativeSum 
FROM Audit t1 
INNER JOIN Audit t2 on t1.col1 >= t2.col1 
GROUP BY t1.col1, t1.col2 
ORDER BY t1.col1 

SELECT col1, col2 FROM #CumulativeSum ORDER BY col2 DESC 

उत्तर को नीचे दिए गए लिंक से कॉपी किया गया था क्योंकि FiReTiTi ने सुझाव दिया था।

how to get cumulative sum

संपादित करें - एक आदेश में क्वेरी होने के लिए।

SELECT col1, col2 FROM(
    SELECT TOP 100 PERCENT t1.col1, t1.col2 AS col2Actual, SUM(t2.col2) AS col2 
    FROM Audit t1 
    INNER JOIN Audit t2 on t1.col1 >= t2.col1 
    GROUP BY t1.col1, t1.col2 
    ORDER BY t1.col1)x 
ORDER BY col2 DESC 

आशा यह आपकी सटीक आवश्यकताओं को प्राप्त करने में मदद मिलेगी।

+0

उत्तर आवश्यक कोड के रूप में संपादित उत्तर। –

+0

क्या कोई तरीका है कि मैं इसे केवल एक कमांड में प्राप्त कर सकता हूं। कारण मैं exec कमांड का उपयोग कर .NET से निष्पादित करता हूं। आपके कार्यान्वयन के साथ मुझे इसे किसी संग्रहीत प्रक्रिया में किसी भी तरह से रखना होगा। धन्यवाद –

+0

एक संग्रहित स्क्रिप्ट प्रक्रिया बनाएं ... यदि आप इसे एक पंक्ति के रूप में कॉल करना चाहते हैं। – maSTAShuFu

1

उपयोग कर सकते हैं एक आदेश में योग के लिए नीचे दिए गए क्वेरी

select [col1] = CONVERT(VARCHAR(10), DATEADD(HOUR, 8, a.date), 101) , 
     [Col2] = (select count(*) from Audit b where b.date<= DATEADD(HOUR, 8, a.date)) 
from Audit a 
group by DATEADD(HOUR, 8, a.date) 
order by CONVERT(VARCHAR(10), DATEADD(HOUR, 8, a.date), 101) desc 
4

उपयोग बयान "के साथ" का प्रयास करें। इस तरह:

WITH TBL ([col1], [col2]) 
AS 
( 
SELECT [col1] = CONVERT(DATE, DATEADD(HOUR, 8, a.date)), 
     [Col2] = COUNT(*) 
FROM Audit a 
GROUP BY CONVERT(DATE, DATEADD(HOUR, 8, a.date)) 
) 
SELECT [col1] = CONVERT(VARCHAR(10), t1.[col1], 101), 
     [col2] = CONVERT(VARCHAR, SUM(t2.[Col2])) 
FROM TBL t1 INNER JOIN TBL t2 on t1.col1 >= t2.col1 
GROUP BY t1.col1 
ORDER BY t1.col1 DESC 

शुभकामनाएँ!

+0

संचयी मूल्य प्राप्त करने का आपका उत्तर यही है। ध्यान में रखने के लिए दो चीजें। 1- साथ के साथ बयान से पहले; 2- एसक्यूएल सर्वर में एक डिफ़ॉल्ट अधिकतम रिकर्सन है (100 मुझे विश्वास है); आप इसे MAXRECURSION() कथन के साथ विस्तारित कर सकते हैं। – Jim

2

यदि आप ऑडिट तालिका का डेटा नमूना देते हैं और आपके परिणाम सेट के डेटा को नहीं चुनते हैं तो आपको ऑप्टिमाइज़ और सटीक क्वेरी मिल सकती है।

Sql 2012,

DECLARE @Audit TABLE (
    [col1] datetime NOT NULL 
    ,[col2] INT NOT NULL 
) 

insert into @audit(col1,Col2) 
VALUES 
('03/05/2017', 1 ) 
,('03/04/2017', 20) 
,('03/03/2017', 10) 
,('03/02/2017', 5 ) 
,('03/01/2017', 10) 

;WITH CTE as 
(
select col1 ,sum(col2) over(ORDER BY col1 desc RANGE BETWEEN 
CURRENT ROW AND UNBOUNDED FOLLOWING) AS col2 
from @Audit 
) 
SELECT * FROM cte 
order by col1 desc 
+0

@ ऐनी, आप अपने वास्तविक डेटा पर रेंज के बदले पंक्तियों का उपयोग कर सकते हैं। – KumarHarsh

1

का उपयोग केवल (इस क्वेरी केवल काम करता है जब आप SQL Server 2012 का उपयोग कर रहे हैं)

प्रयास करें इस क्वेरी नीचे करके अपनी क्वेरी को बदलें:

DECLARE Audit TABLE (date datetime, 
     [col1] int NOT NULL 
    ) 

    insert into Audit(date,Col1) 
    VALUES 
    ('03/05/2017', 1 ) 
    ,('03/04/2017', 20) 
    ,('03/03/2017', 10) 
    ,('03/02/2017', 5 ) 
    ,('03/01/2017', 10) 


    select [col1] = CONVERT(VARCHAR(10), DATEADD(HOUR, 8, a.date), 101) , 
      [Col2] = SUM(col1) over (Order by CONVERT(VARCHAR(10), DATEADD(HOUR, 8, a.date), 101)) 
    from Audit a 
    order by CONVERT(VARCHAR(10), DATEADD(HOUR, 8, a.date), 101) desc 
संबंधित मुद्दे