在 Pivot SQL 表中排序月份

Posted

技术标签:

【中文标题】在 Pivot SQL 表中排序月份【英文标题】:Ordering Months within Pivot SQL Table 【发布时间】:2021-04-06 13:16:54 【问题描述】:

我正在尝试基于月份和年份进行 PIVOT。一般来说,我总是卡在枢轴上。尝试从 1 月到 12 月订购月份,但它总是在年份列之后从 12 月到 1 月开始。这是我到目前为止所做的:

SELECT PvtMonth.TYear,
       PvtMonth.December,
       PvtMonth.November,
       PvtMonth.October,
       PvtMonth.September,
       PvtMonth.August,
       PvtMonth.July,
       PvtMonth.June,
       PvtMonth.May,
       PvtMonth.April,
       PvtMonth.March,
       PvtMonth.February,
       PvtMonth.January
FROM
(
SELECT DATENAME(YEAR, InvoiceDate) AS TYear,DATENAME(MONTH, InvoiceDate) AS TMonth, TrackingNo
FROM [MSM14].[dbo].[PVH_Global_Dash]
WHERE ReceiverAddress LIKE '%78 Mccullough%'
) AS P1
PIVOT
(
    COUNT(TrackingNo)
FOR TMonth IN
(
        [January],
        [February],
        [March],
        [April],
        [May],
        [June],
        [July],
        [August],
        [September],
        [October],
        [November],
        [December]
)) AS PvtMonth

【问题讨论】:

“总是从 12 月到 1 月” 嗯,是的,这就是你定义的...SELECT ... December, November, October..., January。如果您想要一月的第一天,请在您的 SELECT 声明中首先列出它。 Why should I "tag my RDBMS"? - 请添加标签以指定您使用的是 mysqlpostgresqlsql-serveroracledb2 - 或其他完全不同的东西。跨度> 【参考方案1】:

只使用条件聚合:

SELECT YEAR(InvoiceDate) AS TYear,
       SUM(CASE WHEN MONTH(InvoiceDate) = 1 THEN 1 ELSE 0 END) as Jan,
       SUM(CASE WHEN MONTH(InvoiceDate) = 2 THEN 1 ELSE 0 END) as Feb,
       . . . 
FROM [MSM14].[dbo].[PVH_Global_Dash]
WHERE ReceiverAddress LIKE '%78 Mccullough%' AND
      TrackingNo IS NOT NULL
GROUP BY YEAR(InvoiceDate);

条件TrackingNo IS NOT NULL 可能不是必需的,但您的版本正在计算非NULL 值。如果它永远不是NULL,则删除条件。

【讨论】:

以上是关于在 Pivot SQL 表中排序月份的主要内容,如果未能解决你的问题,请参考以下文章

SQL Server 使用 Pivot 和 UnPivot 实现行列转换

SQL Server 使用 Pivot 和 UnPivot 实现行列转换

在 SQL 中对从 1 月到 12 月的月份进行排序

在 SQL 或 LINQ 中基于月份计算三个表中的条目

SQL:从同一个表中聚合不同的月份

优化 expand/pivot_wider R 以标记时间段的所有月份