在 T-SQL 中使用 PIVOT 需要帮助

Posted

技术标签:

【中文标题】在 T-SQL 中使用 PIVOT 需要帮助【英文标题】:Needing assist with using a PIVOT in T-SQL 【发布时间】:2020-12-20 00:58:39 【问题描述】:

在我的 T-SQL 代码中,我的结果集显示如下。 RN 是基于 AgentNumber 的 ROW_NUMBER 计数器:

Period      AgentNumber LocationName    AgencyName  MarketingRep    RTR Quotes  RN
------      ----------- ------------    ----------  ------------    --- ------  --
Jan-20      123         Acme            Acme        csmith          4   0       1
Feb-20      123         Acme            Acme        csmith          8   50      2
Jan-20      456         ZZZ             ZZZ         bbaker          12  0       1
Feb-20      456         ZZZ             ZZZ         bbaker          85  5       2

我一直在尝试在谷歌上寻求帮助,但在使用 PIVOT 拥有多个 SUM 列时遇到了困难。任何帮助/方向将不胜感激。谢谢。

以下是我试图让我的结果集如下所示:

                                                       Jan-20           Feb-20
AgentNumber LocationName    AgencyName  MarketingRep   RTR      Quotes  RTR     Quotes
----------- ------------    ----------  ------------   ---      ------  ---     ------
123         Acme            Acme        csmith         4        0       8       50
456         ZZZ             ZZZ         bbaker         12       0       85      5

这是我的 T-SQL,我正在努力将 Period 列跨越到它自己的行以及 RTR 列开始的位置之上。

这是我的 T-SQL 代码:

SELECT mde.[Period]
    , l.AgentNumber, l.LocationName, l.AgencyName, l.MarketingRep
    , mde.RealTimeRateQuotes
    , mde.Quotes
    , mde.RN
FROM #tempMonthlyDataElements mde
LEFT JOIN #tempUWIssues i
ON mde.AgentID = i.AgentSysID
AND mde.[Year] = i.[Year]
AND mde.[Period] = i.[Period]
AND mde.RN = i.RN
LEFT JOIN #tempPaperlessEFTPercentages pep
ON mde.AgentID = pep.AgentSysID
AND mde.[Year] = pep.[Year]
AND mde.[Period] = pep.[Period]
AND mde.RN = pep.RN
LEFT JOIN #tempAgentNewRenewalCommissionRates acr
ON mde.AgentID = acr.AgentSysID
LEFT JOIN #tempLocations l
ON mde.AgentID = l.AgentSysID 
LEFT JOIN #tempLastNoteInfo lni
ON l.LocationID = lni.LocationID
ORDER BY AgentSysID asc, mde.RN asc;

【问题讨论】:

【参考方案1】:

您可以使用条件聚合:

select mde.Period,
    l.AgentNumber, l.LocationName, l.AgencyName, l.MarketingRep,
    MAX(CASE WHEN mde.Period = 'Jan-20' THEN mde.RealTimeRateQuotes END) as jan_20_rtr,
    MAX(CASE WHEN mde.Period = 'Jan-20' THEN mde.Quotes             END) as jan_20_quote,
    MAX(CASE WHEN mde.Period = 'Jan-20' THEN mde.RealTimeRateQuotes END) as feb_20_rtr,
    MAX(CASE WHEN mde.Period = 'Jan-20' THEN mde.Quotes             END) as feb_20_quote
from ...
group by mde.Period

注意:您真的以这种格式存储期间吗?那应该是date

【讨论】:

感谢您的回复,不幸的是,这是用户想要的格式。有没有办法使用 PIVOT 功能做到这一点?谢谢。

以上是关于在 T-SQL 中使用 PIVOT 需要帮助的主要内容,如果未能解决你的问题,请参考以下文章

SQL 连接的补充?需要 T-SQL 帮助

需要帮助优化 T-SQL 查询

尝试在 T-SQL 查询中使用 Levenshtein 距离 - 请帮助优化

将 Access Crosstab/PIVOT 查询转换为 T-SQL

基于数据的 Oracle Pivot 帮助

T-Sql语法:行转列(pivot)和列转行(unpivot)