获取具有多个枢轴的两列的总和

Posted

技术标签:

【中文标题】获取具有多个枢轴的两列的总和【英文标题】:Get Sum of two columns having multiple pivot 【发布时间】:2018-08-08 12:35:34 【问题描述】:

我创建了一个 SQL 查询,它返回一个人在一个月中的总天数,现在我想添加总列和 3 种类型的休假列,即 [Casual Leave]、[Paid Leave]、[免费休假]。

简而言之,我想将 [Casual Leave]、[Paid Leave] 和 [Complimentary Leave] 添加到总列。

我的查询如下:

;WITH ToPivot
AS ( SELECT 
            time_tracker.date, 
            Users.FirstName + ' ' + Users.LastName AS username, 
            (CASE 
                WHEN 
                    (
                        (datepart(hour, chk_in)) is null 
                        OR (datepart(hour, chk_out)) is null
                    ) 
                    then 
                    0 
                WHEN 
                    (
                        (datepart(hour, chk_in)) >= 12 
                        OR (datepart(hour, chk_out)) < 16 
                        AND ((datepart(hour, chk_out)) - (datepart(hour, chk_in))) < 6
                    ) 
                    THEN 
                    0.5  
                ELSE 
                1 
            END) AS late, TypeOfLeaves.leave_type, Userleavetyp.no_of_days 
            FROM Users 
            INNER JOIN time_tracker ON Users.ID = time_tracker.fk_userid 
            INNER JOIN Userleavetyp ON Users.ID = Userleavetyp.fk_user 
            INNER JOIN TypeOfLeaves ON Userleavetyp.fk_tol = TypeOfLeaves.ID 
            WHERE (Users.FK_Status = 1)
), 
LateTotals AS (
    SELECT T.username, Total = SUM(late),T.leave_type,T.no_of_days 
    FROM ToPivot AS T 
    WHERE T.date BETWEEN '2018-07-01' AND '2018-07-31' GROUP BY T.username,T.leave_type,T.no_of_days
)

SELECT distinct(pv2.username) as original ,PV2.*,L.Total 
FROM ToPivot AS P
PIVOT (SUM(late) FOR date IN ("2018-07-01", "2018-07-02", "2018-07-03", "2018-07-04", "2018-07-05", "2018-07-06", "2018-07-07", "2018-07-08", "2018-07-09", "2018-07-10", "2018-07-11", "2018-07-12", "2018-07-13", "2018-07-14", "2018-07-15", "2018-07-16", "2018-07-17", "2018-07-18", "2018-07-19", "2018-07-20", "2018-07-21", "2018-07-22", "2018-07-23", "2018-07-24", "2018-07-25", "2018-07-26", "2018-07-27", "2018-07-28", "2018-07-29", "2018-07-30", "2018-07-31")) AS pv1
PIVOT (SUM(no_of_days) FOR leave_type IN ([Casual Leave], [Paid Leave], [Complimentary Leave])) AS pv2
LEFT JOIN LateTotals AS L ON L.username = pv2.username

这段代码的输出如下:

【问题讨论】:

轻松帮到你,看看***.com/help/mcve。 至少做一些格式化。此查询是一堵不可读的文本墙。那里有几件事看起来也很可疑。 请忽略之前上传的查询,参考新更新的查询 【参考方案1】:

我相信您只需要按如下方式更改您的选择语句。 从此:

SELECT distinct(pv2.username) as original ,PV2.*,L.Total

到这里:

SELECT distinct(pv2.username) as original ,PV2.*,L.Total,
    CASE WHEN PV2.[Casual Leave] IS NULL THEN 0 ELSE PV2.[Casual Leave] +
    CASE WHEN PV2.[Paid Leave] IS NULL THEN 0 ELSE PV2.[Paid Leave] +
    CASE WHEN PV2.[Complimentary Leave] IS NULL THEN 0 ELSE PV2.[Complimentary Leave]
    AS [Total Leave]

【讨论】:

以上是关于获取具有多个枢轴的两列的总和的主要内容,如果未能解决你的问题,请参考以下文章

将两个表中的列相加到具有两列的第三个表中

具有流体左列和固定右列的两列 div 布局

在一个 LINQ 查询中获取两列的总和

复合求和:我想创建一个复合查询,它从两个不同的表中获取两列的单独总和,然后对它们求和

比较来自两个不同表的两列的逗号分隔值

如何合并来自上下文相关的两列的数据?