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。这是个好主意吗?