Sql 以用户为基础获取百分比,并按月份向下钻取
我想以这种格式打印报告:这些是示例值 到目前为止,我能够做到这一点: 我的问题是:Sql 以用户为基础获取百分比,并按月份向下钻取,sql,sql-server,Sql,Sql Server,我想以这种格式打印报告:这些是示例值 到目前为止,我能够做到这一点: 我的问题是: SELECT t.DisplayName, ROUND((CAST(t.MarksObt AS FLOAT) / CAST(t.TotalMarks AS FLOAT) * 100), 0) AS Percentage, t.EvaluationDate FROM (SELECT u.DisplayName, e.Id, SUM(ea.Quest
SELECT t.DisplayName,
ROUND((CAST(t.MarksObt AS FLOAT) / CAST(t.TotalMarks AS FLOAT) * 100), 0) AS Percentage,
t.EvaluationDate
FROM (SELECT u.DisplayName,
e.Id,
SUM(ea.QuestionMaxMarks) AS TotalMarks,
SUM(CASE WHEN ea.Achieve = 1 THEN ea.QuestionMaxMarks ELSE 0 END) AS MarksObt,
e.EvaluationDate
FROM Users u
JOIN Evaluation e
ON u.UserID = e.PhoneBankerId
JOIN EvaluationAnswer ea
ON e.Id = ea.EvaluationId
JOIN Question q
ON ea.QuestionId = q.Id
JOIN QuestionSection qs
ON q.SectionId = qs.Id
WHERE qs.[Type] = 1
AND e.Id > 31
AND ea.Achieve <> 3
GROUP BY e.Id, u.DisplayName, e.EvaluationDate) As t
非常感谢您的帮助。
谢谢您需要使用PIVOT操作符。下面是一个基于Northwind数据库的示例,该数据库返回每个客户每月的订单总值信息:
;WITH PivotData AS ( SELECT CustomerID, DATENAME(M,OrderDate) as Month, Freight FROM Orders)
SELECT CustomerID,
January,February,March,
April,May,June,
July,August,September,
October,November,December
FROM PivotData
PIVOT( SUM(Freight) FOR Month IN
(January,February,March,
April,May,June,
July,August,September,
October,November,December) ) AS P;
以下是我使用的带有PIVOT运算符的查询的一般结构:
WITH PivotData AS
(
SELECT <grouping column>, <spreading column>, <aggregation column>
FROM <source table>
)
SELECT <select list>
FROM PivotData
PIVOT( <aggregate function >(<aggregation column>)
FOR <spreading column> IN (<distinct spreading values>) ) AS P;
在您的示例中,DisplayName是一个分组列,EvaluationDate的一个月部分是一个扩展列,Percentage是一个聚合列。也使用DECIMAL而不是FLOAT,浮点数据类型可能会给您带来意外的结果,因为它是一种近似数据类型,仅在处理近似值(如Pi值和地球质量等)时使用
SELECT DisplayName
, CAST([JAN] AS VARCHAR(10))+ '%' AS [JAN]
, CAST([FEB] AS VARCHAR(10))+ '%' AS [FEB]
, CAST([MAR] AS VARCHAR(10))+ '%' AS [MAR]
, CAST([APR] AS VARCHAR(10))+ '%' AS [APR]
, CAST([MAY] AS VARCHAR(10))+ '%' AS [MAY]
, CAST([JUN] AS VARCHAR(10))+ '%' AS [JUN]
, CAST([JUL] AS VARCHAR(10))+ '%' AS [JUL]
, CAST([AUG] AS VARCHAR(10))+ '%' AS [AUG]
, CAST([SEP] AS VARCHAR(10))+ '%' AS [SEP]
, CAST([OCT] AS VARCHAR(10))+ '%' AS [OCT]
, CAST([NOV] AS VARCHAR(10))+ '%' AS [NOV]
, CAST([DEC] AS VARCHAR(10))+ '%' AS [DEC]
FROM
(
-- Your query here but get data in following format
SELECT DisplayName
,Percentage
,UPPER(LEFT(DATENAME(MONTH, EvaluationDate), 3)) AS EvaluationDate
FROM @TABLE
)t
PIVOT (AVG(Percentage)
FOR EvaluationDate
IN ([JAN],[FEB],[MAR],[APR],[MAY],[JUN],[JUL],[AUG],[SEP],[OCT],[NOV],[DEC])
)p
你看过T-SQL透视图了吗?好的,让我看看。谢谢你的回复。谢谢你的回答。让我把它转换成我的查询。工作完美。还有一件事,那就是最后一列,所有月份的累积平均数。我怎么计算呢?我想把所有的栏目加起来,比如[JAN]+[FEB]。。。。[DEC]除以12。这是个好主意吗?