Sqlserver
 sql >> डेटाबेस >  >> RDS >> Sqlserver

SQL सर्वर में प्रारंभ से अंत तक प्रत्येक दिन के लिए रिकॉर्ड प्राप्त करने के लिए मैं अपने डेटा को कैलेंडर में कैसे शामिल कर सकता हूं

SQL Fiddle

CTE_Users हमें प्रत्येक उपयोगकर्ता के लिए प्रारंभ और समाप्ति तिथियों वाले सभी उपयोगकर्ताओं की सूची देता है।

यह Calendar . के साथ जुड़ा हुआ है प्रत्येक उपयोगकर्ता के लिए प्रत्येक तिथि के लिए पंक्ति उत्पन्न करने के लिए तालिका।

अंत में इसे मुख्य तालिका के साथ जोड़ दिया गया है Test Total लौटाने के लिए प्रत्येक तिथि के लिए। ISNULL सुनिश्चित करता है कि वे तिथियां जिनमें डेटा नहीं है 0.

WITH
CTE_Users
AS
(
    SELECT
        Userid
        ,MIN(startdate) AS StartDate
        ,MAX(enddate) AS EndDate
    FROM TEST
    GROUP BY Userid
)
SELECT
    ROW_NUMBER() OVER (ORDER BY CTE_Users.Userid, Calendar.dt) AS ID
    ,CTE_Users.Userid
    ,T.Id1
    ,Calendar.dt
    ,ISNULL(T.Total, 0) AS Total
FROM
    CTE_Users
    INNER JOIN Calendar ON
            Calendar.dt >= CTE_Users.StartDate
        AND Calendar.dt <= CTE_Users.EndDate
    LEFT JOIN TEST AS T ON
        T.Userid = CTE_Users.Userid
        AND T.date1 = Calendar.dt
ORDER BY CTE_Users.Userid, Calendar.dt;

परिणाम

| ID | Userid |    Id1 |         dt | Total |
|----|--------|--------|------------|-------|
|  1 |    abc |      1 | 2015-01-13 |   200 |
|  2 |    abc |      2 | 2015-01-14 |   200 |
|  3 |    abc |      3 | 2015-01-15 |   200 |
|  4 |    abc | (null) | 2015-01-16 |     0 |
|  5 |    abc | (null) | 2015-01-17 |     0 |
|  6 |    abc | (null) | 2015-01-18 |     0 |
|  7 |    abc |      4 | 2015-01-19 |   200 |
|  8 |    abc |      5 | 2015-01-20 |   200 |
|  9 |    abc | (null) | 2015-01-21 |     0 |
| 10 |    abc | (null) | 2015-01-22 |     0 |
| 11 |    abc |      6 | 2015-01-23 |   200 |
| 12 |    abc |      7 | 2015-01-24 |   200 |
| 13 |    def | (null) | 2015-02-10 |     0 |
| 14 |    def | (null) | 2015-02-11 |     0 |
| 15 |    def |      8 | 2015-02-12 |   200 |
| 16 |    def |      9 | 2015-02-13 |   200 |
| 17 |    def | (null) | 2015-02-14 |     0 |
| 18 |    def |     10 | 2015-02-15 |   200 |
| 19 |    def |     11 | 2015-02-16 |   200 |
| 20 |    def |     12 | 2015-02-17 |   200 |
| 21 |    def |     13 | 2015-02-18 |   200 |
| 22 |    def | (null) | 2015-02-19 |     0 |
| 23 |    def | (null) | 2015-02-20 |     0 |

ID मक्खी पर उत्पन्न एक पंक्ति संख्या है।Id1 Test . से मूल आईडी है मेज़।

मैं Calendar उत्पन्न करूंगा इस तरह की तालिका:

CREATE TABLE [Calendar](
    [dt] [date] NOT NULL
CONSTRAINT [PK_Calendar] PRIMARY KEY CLUSTERED 
(
    [dt] ASC
));

-- 10K dates from 2000-01-01 till 2027-05-18
INSERT INTO Calendar (dt)
SELECT TOP (10000)
    DATEADD(day, ROW_NUMBER() OVER (ORDER BY s1.[object_id])-1, '2000-01-01') AS dt
FROM sys.all_objects AS s1 CROSS JOIN sys.all_objects AS s2
OPTION (MAXDOP 1);


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. सभी तालिकाओं की स्कीमा खोजने के लिए SQL क्वेरी

  2. पुनर्प्राप्ति बनाम कोई पुनर्प्राप्ति विकल्प के साथ SQL सर्वर पुनर्स्थापना डेटाबेस का अन्वेषण करें

  3. मैं SQL सर्वर प्रबंधन स्टूडियो के साथ एक समग्र कुंजी कैसे बनाऊं?

  4. समान आईडी वाली पंक्तियों वाली तालिका से कॉलम का उपयोग करके स्ट्रिंग मान बनाने का सबसे अच्छा तरीका कौन सा है?

  5. LINQ के साथ कॉलम डेटा एन्क्रिप्ट करें