使用Sql查询以格式化方式获取用户数据

前端之家收集整理的这篇文章主要介绍了使用Sql查询以格式化方式获取用户数据前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我需要在报告中显示格式化数据.我使用三个表,其中一个添加新用户,第二个用于付款,最后一个用于任何用户辞职.以下是示例表和默认数据:
CREATE TABLE [dbo].[Entry]
(
    [EmpId] [int] IDENTITY(1,1) NOT NULL,[EmpName] [nvarchar](40) NULL,[Address] [nvarchar](100) NULL,[Email] [nvarchar](20) NULL,[EntryDate] [datetime] NULL
)

INSERT [dbo].[Entry] ([EmpId],[EmpName],[Address],[Email],[EntryDate]) 
VALUES (1,N'John',N'On Earth',N'john@abc.com',CAST(0x0000A58000000000 AS DateTime)),(2,N'Jack',N'jack@abc.com',CAST(0x0000A5A800000000 AS DateTime)),(3,N'Jessi',N'jessi@abc.com',CAST(0x0000A5CF00000000 AS DateTime)),(4,N'Jackson',N'jackson@abc.com',CAST(0x0000A5E400000000 AS DateTime))

CREATE TABLE [dbo].[Payment]
(
    [Id] [int] IDENTITY(1,[EmpId] [int] NULL,[Payment] [float] NULL,[PayDate] [datetime] NULL
)

INSERT [dbo].[Payment] ([Id],[EmpId],[Payment],[PayDate]) 
VALUES (1,1,2000,CAST(0x0000A61800000000 AS DateTime)),CAST(0x0000A63600000000 AS DateTime)),CAST(0x0000A65500000000 AS DateTime)),CAST(0x0000A67400000000 AS DateTime)),(5,2,4000,CAST(0x0000A5DB00000000 AS DateTime)),(6,CAST(0x0000A5F900000000 AS DateTime)),(7,(8,(9,(10,(11,CAST(0x0000A69200000000 AS DateTime)),(12,3,6000,(13,(14,4,8000,CAST(0x0000A7FF00000000 AS DateTime)),(15,CAST(0x0000A98B00000000 AS DateTime))

CREATE TABLE [dbo].[Resign]
(
    [Id] [int] IDENTITY(1,[ResignDate] [datetime] NULL,[Reason] [nchar](10) NULL
)

INSERT [dbo].[Resign] ([Id],[ResignDate],[Reason]) 
VALUES (1,CAST(0x0000A69B00000000 AS DateTime),N'Resigned  '),CAST(0x0000A6C400000000 AS DateTime),N'Resigned')

所需的输出如下:这将是逐年的:

Year 2015

Month - Jan - Feb - Mar - Apr - May - Jun - Jul - Aug - Sep - Oct - Nov - Dec
opening - 10 - 10 - 10 - 12 - 12 - 12 - 12 - 12 - 12 - 12 - 8 - 8 //Total no. of employee
Add     -  0 -  0 -  2 -  0 -  0 -  0 -  0 -  0 -  0 -  0 - 0 - 0 //Newly added
Left    -  0 -  0 -  0 -  0 -  0 -  0 -  0 -  0 -  0 -  4 - 0 - 0 //Resigned
Closing - 10 - 10 - 12 - 12 - 12 - 12 - 12 - 12 - 12 -  8 - 8 - 8 //Closing Total

Year 2016

Month - Jan - Feb - Mar - Apr - May - Jun - Jul - Aug - Sep - Oct - Nov - Dec
opening - 8 ----Goes on in the similar way
Add -----
Left ----
Closing ----

因此,很清楚如何在报告中显示数据.虽然我知道报告中的年度分组,并尝试过类似的数据,按月显示数据如下:

SELECT 
    DATEPART(YYYY,Q.PayDate) [YEAR],COUNT(m.EmpId) Total,SUM(CASE WHEN DATENAME(MONTH,m.EntryDate) = 'January' THEN 1 ELSE 0 END) [JAN],m.EntryDate) = 'February' THEN 1 ELSE 0 END) [FEB]  
FROM 
    Entry m 
INNER JOIN 
    Payment q ON Q.EmpId = M.EmpId 
LEFT JOIN
    Resign OUT ON OUT.EmpId = m.EmpId 
WHERE 
    m.EmpId NOT IN (SELECT DISTINCT p.EmpId FROM Resign p)
    AND m.EmpId IN (SELECT DISTINCT k.EmpId FROM Payment k)
GROUP BY 
    DATEPART(YYYY,Q.PayDate),DATEPART(MM,m.EntryDate);

上面的查询返回如下内容

YEAR  Total JAN FEB
--------------------
2016  2     0   0
2017  1     0   0
2018  1     0   0

但我不确定如何在给出的样本中以相同的查询显示添加的以及已重新排列的用户

N.B:我对任何查询语言都是开放的.因此,期待您的想法以适当的方式实施.

解决方法

如果您计划运行其中许多工具,那么您绝对应该将工作转移到SSRS等报告工具上.它会简化很多次.话虽如此,这是一种可以产生上述结果的方法.
DECLARE @Entry TABLE
(
    [EmpId] [int]  NOT NULL,[EntryDate] [datetime] NULL
)

INSERT @Entry ([EmpId],[EntryDate]) 

VALUES
       (100,N'Early','01/01/2015'),(1,CAST(0x0000A5E400000000 AS DateTime))

DECLARE @Payment TABLE 
(
    [Id] [int]  NOT NULL,[PayDate] [datetime] NULL
)

INSERT @Payment ([Id],CAST(0x0000A98B00000000 AS DateTime))

DECLARE  @Resign TABLE
(
    [Id] [int]  NOT NULL,[Reason] [nchar](10) NULL
)

INSERT @Resign ([Id],N'Resigned')

DECLARE @StartDate DATETIME = '01/01/2015'
DECLARE @EndDate DATETIME = '12/01/2016'

;WITH Calendar as
 (
    SELECT CalendarDate = @StartDate,CalendarYear = DATEPART(YEAR,@StartDate),CalendarMonth = DATEPART(MONTH,@StartDate)
    UNION ALL
    SELECT CalendarDate = DATEADD(MONTH,CalendarDate),CalendarDate)
    FROM Calendar
    WHERE DATEADD (MONTH,CalendarDate) <= @EndDate
 ),Employees AS
 (
     SELECT
        E.EmpID,StartDate = DATEADD(MONTH,DATEDIFF(MONTH,EntryDate),0),EndDate = DATEADD(MONTH,ResignDate),0)
    FROM     
        @Entry E
        LEFT OUTER JOIN @Resign R ON R.EmpId = E.EmpId
),NormalizedAndUnpivoted AS
(
    SELECT
        *,GroupField = CAST(DATEPART(MONTH,CalendarDate) AS NVARCHAR(50))+'_'+CAST(DATEPART(YEAR,CalendarDate) AS NVARCHAR(50)),SortOrder = CASE 
            WHEN Property='opening' THEN 1
            WHEN Property='Addition'  THEN 2
            WHEN Property='Subtraction'  THEN 3
            WHEN Property='Total'  THEN 4
        END
    FROM
    (
        SELECT 
            C.CalendarDate,opening =  COUNT(DISTINCT EmpExisting.EmpID),Addition = COUNT(DISTINCT EmpStarted.EmpID),Subtraction = COUNT(DISTINCT EmpEnd.EmpID),Total = COUNT(DISTINCT EmpExisting.EmpID) + COUNT(DISTINCT EmpStarted.EmpID) - COUNT(DISTINCT EmpEnd.EmpID)
        FROM 
            Calendar C
            LEFT OUTER JOIN Employees EmpExisting ON EmpExisting.StartDate < C.CalendarDate AND (EmpExisting.EndDate IS NULL OR EmpExisting.EndDate >=  C.CalendarDate)
            LEFT OUTER JOIN Employees EmpStarted ON EmpStarted.StartDate = C.CalendarDate
            LEFT OUTER JOIN Employees EmpEnd ON EmpEnd.EndDate = C.CalendarDate
        GROUP BY
            C.CalendarDate      
    )AS X
    UNPIVOT(
        PivotValue FOR Property IN (opening,Addition,Subtraction,Total)
    ) AS U
),Pivoted AS
(
    SELECT
        CalendarYear,Property,SortOrder,Janurary=SUM(CASE WHEN CalendarMonth=1 THEN PivotValue ELSE NULL END),Feburary=SUM(CASE WHEN CalendarMonth=2 THEN PivotValue ELSE NULL END),March=SUM(CASE WHEN CalendarMonth=3 THEN PivotValue ELSE NULL END),April=SUM(CASE WHEN CalendarMonth=4 THEN PivotValue ELSE NULL END),May=SUM(CASE WHEN CalendarMonth=5 THEN PivotValue ELSE NULL END),June=SUM(CASE WHEN CalendarMonth=6 THEN PivotValue ELSE NULL END),July=SUM(CASE WHEN CalendarMonth=7 THEN PivotValue ELSE NULL END),August=SUM(CASE WHEN CalendarMonth=8 THEN PivotValue ELSE NULL END),September=SUM(CASE WHEN CalendarMonth=9 THEN PivotValue ELSE NULL END),October=SUM(CASE WHEN CalendarMonth=10 THEN PivotValue ELSE NULL END),November=SUM(CASE WHEN CalendarMonth=11 THEN PivotValue ELSE NULL END),December=SUM(CASE WHEN CalendarMonth=12 THEN PivotValue ELSE NULL END)
    FROM
        NormalizedAndUnpivoted
    GROUP BY
        CalendarYear,SortOrder
)

SELECT * FROM Pivoted
ORDER BY
    CalendarYear,SortOrder
OPTION (MAXRECURSION 1000)

结果:

CalendarYear Property                       SortOrder   Janurary    Feburary    March       April       May         June        July        August      September   October     November    December
------------ ------------------------------ ----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- -----------
2015         opening                        1           0           1           1           1           1           1           1           1           1           1           1           1
2015         Addition                       2           1           0           0           0           0           0           0           0           0           0           0           0
2015         Subtraction                    3           0           0           0           0           0           0           0           0           0           0           0           0
2015         Total                          4           1           1           1           1           1           1           1           1           1           1           1           1
2016         opening                        1           1           2           3           4           5           5           5           5           5           5           4           3
2016         Addition                       2           1           1           1           1           0           0           0           0           0           0           0           0
2016         Subtraction                    3           0           0           0           0           0           0           0           0           0           1           1           0
2016         Total                          4           2           3           4           5           5           5           5           5           5           4           3           3
原文链接:https://www.f2er.com/mssql/78398.html

猜你在找的MsSQL相关文章