- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我需要在报告中显示格式化数据。我使用三个表,其中一个添加新用户,第二个用于他们的付款,最后一个用于是否有用户辞职。以下是示例表和默认数据:
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'On Earth', N'jack@abc.com', CAST(0x0000A5A800000000 AS DateTime)),
(3, N'Jessi', N'On Earth', N'jessi@abc.com', CAST(0x0000A5CF00000000 AS DateTime)),
(4, N'Jackson', N'On Earth', N'jackson@abc.com', CAST(0x0000A5E400000000 AS DateTime))
CREATE TABLE [dbo].[Payment]
(
[Id] [int] IDENTITY(1,1) NOT NULL,
[EmpId] [int] NULL,
[Payment] [float] NULL,
[PayDate] [datetime] NULL
)
INSERT [dbo].[Payment] ([Id], [EmpId], [Payment], [PayDate])
VALUES (1, 1, 2000, CAST(0x0000A61800000000 AS DateTime)), (2, 1, 2000, CAST(0x0000A63600000000 AS DateTime)),
(3, 1, 2000, CAST(0x0000A65500000000 AS DateTime)), (4, 1, 2000, CAST(0x0000A67400000000 AS DateTime)),
(5, 2, 4000, CAST(0x0000A5DB00000000 AS DateTime)), (6, 2, 4000, CAST(0x0000A5F900000000 AS DateTime)),
(7, 2, 4000, CAST(0x0000A61800000000 AS DateTime)), (8, 2, 4000, CAST(0x0000A63600000000 AS DateTime)),
(9, 2, 4000, CAST(0x0000A65500000000 AS DateTime)), (10, 2, 4000, CAST(0x0000A67400000000 AS DateTime)),
(11, 2, 4000, CAST(0x0000A69200000000 AS DateTime)), (12, 3, 6000, CAST(0x0000A65500000000 AS DateTime)),
(13, 3, 6000, CAST(0x0000A67400000000 AS DateTime)), (14, 4, 8000, CAST(0x0000A7FF00000000 AS DateTime)),
(15, 4, 8000, CAST(0x0000A98B00000000 AS DateTime))
CREATE TABLE [dbo].[Resign]
(
[Id] [int] IDENTITY(1,1) NOT NULL,
[EmpId] [int] NULL,
[ResignDate] [datetime] NULL,
[Reason] [nchar](10) NULL
)
INSERT [dbo].[Resign] ([Id], [EmpId], [ResignDate], [Reason])
VALUES (1, 1, CAST(0x0000A69B00000000 AS DateTime), N'Resigned '),
(2, 2, 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],
SUM(CASE WHEN DATENAME(MONTH, 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
但我不确定如何在与给定示例相同的查询行中显示新添加的以及已辞职的用户?
注意:我对任何查询语言持开放态度。因此期待您的想法能够以适当的方式实现。
最佳答案
如果您计划运行其中许多报告工具,那么您绝对应该将精力转移到 SSRS 等报告工具上。它将使事情简化很多倍。话虽这么说,这是一种可以产生您上面提到的结果的方法。
DECLARE @Entry TABLE
(
[EmpId] [int] NOT NULL,
[EmpName] [nvarchar](40) NULL,
[Address] [nvarchar](100) NULL,
[Email] [nvarchar](20) NULL,
[EntryDate] [datetime] NULL
)
INSERT @Entry ([EmpId], [EmpName], [Address], [Email], [EntryDate])
VALUES
(100, N'Early', N'On Earth', N'john@abc.com', '01/01/2015'),
(1, N'John', N'On Earth', N'john@abc.com', CAST(0x0000A58000000000 AS DateTime)),
(2, N'Jack', N'On Earth', N'jack@abc.com', CAST(0x0000A5A800000000 AS DateTime)),
(3, N'Jessi', N'On Earth', N'jessi@abc.com', CAST(0x0000A5CF00000000 AS DateTime)),
(4, N'Jackson', N'On Earth', N'jackson@abc.com', CAST(0x0000A5E400000000 AS DateTime))
DECLARE @Payment TABLE
(
[Id] [int] NOT NULL,
[EmpId] [int] NULL,
[Payment] [float] NULL,
[PayDate] [datetime] NULL
)
INSERT @Payment ([Id], [EmpId], [Payment], [PayDate])
VALUES (1, 1, 2000, CAST(0x0000A61800000000 AS DateTime)), (2, 1, 2000, CAST(0x0000A63600000000 AS DateTime)),
(3, 1, 2000, CAST(0x0000A65500000000 AS DateTime)), (4, 1, 2000, CAST(0x0000A67400000000 AS DateTime)),
(5, 2, 4000, CAST(0x0000A5DB00000000 AS DateTime)), (6, 2, 4000, CAST(0x0000A5F900000000 AS DateTime)),
(7, 2, 4000, CAST(0x0000A61800000000 AS DateTime)), (8, 2, 4000, CAST(0x0000A63600000000 AS DateTime)),
(9, 2, 4000, CAST(0x0000A65500000000 AS DateTime)), (10, 2, 4000, CAST(0x0000A67400000000 AS DateTime)),
(11, 2, 4000, CAST(0x0000A69200000000 AS DateTime)), (12, 3, 6000, CAST(0x0000A65500000000 AS DateTime)),
(13, 3, 6000, CAST(0x0000A67400000000 AS DateTime)), (14, 4, 8000, CAST(0x0000A7FF00000000 AS DateTime)),
(15, 4, 8000, CAST(0x0000A98B00000000 AS DateTime))
DECLARE @Resign TABLE
(
[Id] [int] NOT NULL,
[EmpId] [int] NULL,
[ResignDate] [datetime] NULL,
[Reason] [nchar](10) NULL
)
INSERT @Resign ([Id], [EmpId], [ResignDate], [Reason])
VALUES (1, 1, CAST(0x0000A69B00000000 AS DateTime), N'Resigned '),
(2, 2, CAST(0x0000A6C400000000 AS DateTime), 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, 1, CalendarDate), CalendarYear = DATEPART(YEAR, CalendarDate), CalendarMonth = DATEPART(MONTH, CalendarDate)
FROM Calendar
WHERE DATEADD (MONTH, 1, CalendarDate) <= @EndDate
)
,Employees AS
(
SELECT
E.EmpID,
StartDate = DATEADD(MONTH, DATEDIFF(MONTH, 0, EntryDate), 0),
EndDate = DATEADD(MONTH, DATEDIFF(MONTH, 0, ResignDate), 0)
FROM
@Entry E
LEFT OUTER JOIN @Resign R ON R.EmpId = E.EmpId
)
,NormalizedAndUnpivoted AS
(
SELECT
*,
CalendarMonth = DATEPART(MONTH,CalendarDate),
CalendarYear = DATEPART(YEAR,CalendarDate),
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,
Property,
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
关于sql - 使用 Sql 查询以格式化方式获取用户数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51324569/
我正在从事的项目需要使用 toString 方法打印银行帐户余额。我不允许向当前程序添加任何方法,但我需要将 myBalance 变量格式化为 double 型,该变量保留两位小数而不是一位。在这个特
我喜欢 Visual Studio (2008) 格式化 C# 代码的方式;不幸的是,在编写 C++ 代码时,它的行为方式似乎有所不同。 比如我这样写代码的时候: class Test { publi
Scanner scan = new Scanner(System.in); System.out.println("Enter three positive integers seperated b
在 aspose(使用 C#)中用于格式化数字的正确样式属性是什么。我想做两件事: 1) 将五位数字格式化为邮政编码。(我不太确定使用哪个 Style 属性来获取自定义 excel 邮政编码格式) 2
我希望用户输入从 00 到 23 和从 00 到 59 的 Local.Time 的小时和分钟,我将其扫描为一个 int。它有效,但对于从 00 到 09 的值,int 忽略 0,然后将其放置为 0,
大家好, 请查看上面的图片,我有两张 table 。在下面代码的第一个表中,我得到了这种格式。 但我想像 Table2 那样格式化,每个合并单元格中的行数是动态的,而且不一样。 有没有办法像table
我在一个 laravel 网站工作,我只是想知道是否有办法为用户格式化 created_at 值,因为现在它类似于以下内容: 2017-09-20 13:41 但我更愿意将其格式化为易于阅读的格式,例
我正在尝试在 JTextPane 中进行一些基本的格式化。为此,我决定使用 html(HTMLDocument 和 HTMLEditorKit)。 这里是按钮的操作监听器代码,应使所选文本变为粗体 b
是否有规则或插件会导致 es-lint 错误或警告,如果范围内的声明没有像下面那样间隔,赋值运算符的对齐方式相同? var a = 'a'; var bb = 'b'; var ccc = 'd
我正在尝试重新格式化 LinkedHashMap 的输出以排除逗号和大括号。 这是我的看跌期权: token.put("[Server.Protocol]", url.getProtocol() +
我有一个程序,可以从文本文件中读取大量文本,然后根据文本内容随机化内容以显示为短篇故事。该程序可以运行,但最后一部分(我显示的 Material )非常笨重且效率不高,我想知道是否有人对如何更有效地获
我正在尝试将 VIM 作为我的 ruby/rails 编辑器。太胖了,我对它的功能印象深刻 并且我能够安装以下插件以提供更好的 IDE 体验 自动配对 Better-snipmate-snippe
很难说出这里问的是什么。这个问题是含糊的、模糊的、不完整的、过于宽泛的或修辞性的,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开它,visit the help center 。 已关
我有两个 jQuery 函数。我想先运行下面的第一个,然后在该函数完成后运行另一个。通常我会在代码的第一部分添加一个函数,但不确定如何使用这个 block 来做到这一点,或者它是否是正确的方法。 简而
在 Python 2.7 中,我有一个包含数字 1-25 字符串的列表(例如)。打印它们时,我希望列表打印 5 行,每行 5 个数字。 理想情况下: >>> print(myList) ['1', '
我有以下功能来打印借阅者已取出的书籍列表。 void searchBorrowerLoans(int a) { int i; for (i = 1
关闭。这个问题是opinion-based 。目前不接受答案。 想要改进这个问题吗?更新问题,以便 editing this post 可以用事实和引文来回答它。 . 已关闭 5 年前。 Improv
我正在尝试实现一个用作 ListView header 的 TextView。我想对其进行格式化,以便我基本上有一个以第一行为中心的标题,然后是以下几行的附加信息。如何格式化文本/字符串以创建这种格式
我尝试格式化数字字段 select to_char(12315.83453, 'FM999999999999D9999') 在这种情况下一切正常。结果是 12315.8345 但是如果值在0到1之间
我有一个带有 BigDecimal 字段的类。我把这个对象放到 JSP(Spring MVC)中。而且我需要显示十进制不带零的 BigDecimal 字段(20.00 就像 20),这就是为什么我的
我是一名优秀的程序员,十分优秀!