繁体   English   中英

基于月列对数据进行分组的最佳方法是什么?

[英]What would be the best way to group my data that is based on monthly columns?

因此,基本上,我正在制作一个报告,显示从1月到7月任何给定月份内所有产品的最高价格。理想情况下,我希望每个PartNo 1行,并显示每个月的最高价格。 这是我的代码和以下结果的照片:

SELECT
    pd.PartNo,
    CASE
        WHEN MONTH(p.DateEnt) = 1 AND YEAR(p.DateEnt) = 2018 THEN MAX(pd.UnitCost)
        END AS [Jan 2018],
    CASE
        WHEN MONTH(p.DateEnt) = 2 AND YEAR(p.DateEnt) = 2018 THEN MAX(pd.UnitCost)
        END AS [Feb 2018],
    CASE
        WHEN MONTH(p.DateEnt) = 3 AND YEAR(p.DateEnt) = 2018 THEN MAX(pd.UnitCost)
        END AS [Mar 2018],
    CASE
        WHEN MONTH(p.DateEnt) = 4 AND YEAR(p.DateEnt) = 2018 THEN MAX(pd.UnitCost)
        END AS [Apr 2018],
    CASE
        WHEN MONTH(p.DateEnt) = 5 AND YEAR(p.DateEnt) = 2018 THEN MAX(pd.UnitCost)
        END AS [May 2018],
    CASE
        WHEN MONTH(p.DateEnt) = 6 AND YEAR(p.DateEnt) = 2018 THEN MAX(pd.UnitCost)
        END AS [Jun 2018],
    CASE
        WHEN MONTH(p.DateEnt) = 7 AND YEAR(p.DateEnt) = 2018 THEN MAX(pd.UnitCost)
        END AS [Jul 2018]
FROM PODet pd
    JOIN PO p ON pd.PONum = p.PONum
    JOIN Estim e ON pd.PartNo = e.PartNo
WHERE p.DateEnt > '20180101'
GROUP BY pd.PartNo, p.DateEnt
ORDER BY pd.PartNo, p.DateEnt DESC

在此处输入图片说明

因此,如果您查看结果并查看PartNo CAB-01,您不仅可以看到它不是跨列分组,而且在同一个月内它也没有分组。 我究竟做错了什么? 提前Thx

您希望每个零件号都有一行,但是在GROUP BY子句中,您告诉它在每个零件号条目发生在的唯一日期每个行产生一行: GROUP BY Pd.PartNo, Pd.DateEnt 很显然,CAB-01项目在7月有两个不同的日期,因此它有两行的值在'Jul 2018'下; 您只是不能说出它们是两个不同的日期,因为确切的日期不是输出的一部分。

要获得所需的内容,需要从GROUP BYORDER BY子句中删除Pd.DateEnt ,然后将MAX()CASE语句的内部移到外部,以使GROUP BY仍然有效:

SELECT
pd.PartNo,
MAX(CASE
    WHEN MONTH(p.DateEnt) = 1 AND YEAR(p.DateEnt) = 2018 THEN pd.UnitCost
    END) AS [Jan 2018],
MAX(CASE
    WHEN MONTH(p.DateEnt) = 2 AND YEAR(p.DateEnt) = 2018 THEN pd.UnitCost
    END) AS [Feb 2018],
MAX(CASE
    WHEN MONTH(p.DateEnt) = 3 AND YEAR(p.DateEnt) = 2018 THEN pd.UnitCost
    END) AS [Mar 2018],
MAX(CASE
    WHEN MONTH(p.DateEnt) = 4 AND YEAR(p.DateEnt) = 2018 THEN pd.UnitCost
    END) AS [Apr 2018],
MAX(CASE
    WHEN MONTH(p.DateEnt) = 5 AND YEAR(p.DateEnt) = 2018 THEN pd.UnitCost
    END) AS [May 2018],
MAX(CASE
    WHEN MONTH(p.DateEnt) = 6 AND YEAR(p.DateEnt) = 2018 THEN pd.UnitCost
    END) AS [Jun 2018],
MAX(CASE
    WHEN MONTH(p.DateEnt) = 7 AND YEAR(p.DateEnt) = 2018 THEN pd.UnitCost
    END) AS [Jul 2018]
FROM PODet pd
    JOIN PO p ON pd.PONum = p.PONum
    JOIN Estim e ON pd.PartNo = e.PartNo
WHERE p.DateEnt > '20180101'
GROUP BY pd.PartNo
ORDER BY pd.PartNo

而且,您根本没有在查询中使用ESTIM表,如图所示,因此您可能希望将JOIN删除掉。 如果要包括2018年的全部内容,则应将WHERE条件更改为WHERE p.DateEnt >= '20180101'

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM