【问题标题】:How to rotate multiple sums in a single query from columns into rows如何将单个查询中的多个总和从列旋转到行
【发布时间】:2015-09-25 19:39:30
【问题描述】:

我已经搜索了所有答案数据库,但老实说还没有找到我需要的东西。我有一个包含合同价值的表格以及与每个价值相关的日期。我的查询应该总结过去 6 个月累积的合同价值,从当前日期开始并回顾 3 个月,始终考虑 6 个月的累积期:

SELECT
SUM((ContractDate > DATE_SUB(DATE_SUB(CURDATE(), INTERVAL 0 MONTH), INTERVAL 6 MONTH) AND (ContractCancelled <>1)) * ContractValue) AS Today, 
SUM((ContractDate > DATE_SUB(DATE_SUB(CURDATE(), INTERVAL 1 MONTH), INTERVAL 6 MONTH) AND (ContractDate <= DATE_SUB(CURDATE(), INTERVAL 1 MONTH)) AND (ContractCancelled <>1)) * ContractValue) AS OneMonthAgo,
SUM((ContractDate > DATE_SUB(DATE_SUB(CURDATE(), INTERVAL 2 MONTH), INTERVAL 6 MONTH) AND (ContractDate <= DATE_SUB(CURDATE(), INTERVAL 2 MONTH)) AND (ContractCancelled <>1)) * ContractValue) AS TwoMonthsAgo, 
SUM((ContractDate > DATE_SUB(DATE_SUB(CURDATE(), INTERVAL 3 MONTH), INTERVAL 6 MONTH) AND (ContractDate <= DATE_SUB(CURDATE(), INTERVAL 3 MONTH)) AND (ContractCancelled <>1)) * ContractValue) AS ThreeMonthsAgo 
FROM Contracts

查询工作正常,但我在一行中得到结果,每个累积值在不同的列中:

+----+---------+-------------+--------------+----------------+
|    | Today   | OneMonthAgo | TwoMonthsAgo | ThreeMonthsAgo | 
+--------------+-------------+--------------+----------------+
|  1 | 3434005 |   3992877   |    4104565   |     3688412    |
+--------------+-------------+--------------+----------------+

我需要将这个查询变成一个图表,并且要做到这一点,而不是列,累积的结果应该显示为行,或者像这样:

+---------------+--------------------------------------+
|  LookingTo    |  AcumulatedContractValue (6 months)  | 
+---------------+--------------------------------------+
|    Today      |              3434005                 |
+---------------+--------------------------------------+
| OneMonthAgo   |              3992877                 |
+---------------+--------------------------------------+
| TwoMonthsAgo  |              4104565                 |
+---------------+--------------------------------------+
|ThreeMonthsAgo |              3688412                 |
+---------------+--------------------------------------+

如果它是在 MS SQL 中,我相信 PIVOT 应该可以工作,但我不知道如何在 MySQL 中做到这一点。你能帮我解决这个问题吗?

【问题讨论】:

    标签: mysql sum pivot


    【解决方案1】:

    我不明白你为什么需要它,但你可以联合:

    SELECT 'Today' as `LookingTo`,
    SUM((ContractDate > DATE_SUB(DATE_SUB(CURDATE(), INTERVAL 0 MONTH), INTERVAL 6 MONTH) AND (ContractCancelled <>1)) * ContractValue) as  Acumulated
    FROM Contracts
    UNION ALL
    SELECT 'OneMonthAgo',
    SUM((ContractDate > DATE_SUB(DATE_SUB(CURDATE(), INTERVAL 1 MONTH), INTERVAL 6 MONTH) AND (ContractDate <= DATE_SUB(CURDATE(), INTERVAL 1 MONTH)) AND (ContractCancelled <>1)) * ContractValue)
    FROM Contracts
    UNION ALL
    SELECT 'TwoMonthsAgo',
    SUM((ContractDate > DATE_SUB(DATE_SUB(CURDATE(), INTERVAL 2 MONTH), INTERVAL 6 MONTH) AND (ContractDate <= DATE_SUB(CURDATE(), INTERVAL 2 MONTH)) AND (ContractCancelled <>1)) * ContractValue)  
    FROM Contracts
    UNION ALL
    SELECT 'ThreeMonthsAgo',
    SUM((ContractDate > DATE_SUB(DATE_SUB(CURDATE(), INTERVAL 3 MONTH), INTERVAL 6 MONTH) AND (ContractDate <= DATE_SUB(CURDATE(), INTERVAL 3 MONTH)) AND (ContractCancelled <>1)) * ContractValue) 
    FROM Contracts
    

    【讨论】:

    • 现在让我知道这些字段的含义:ContractCancelled 和 ContractValue。为什么您的查询中有这个 (ContractCancelled 1)。当我了解您的查询时,我会向您发送优化查询。当 ContractCancelled 不等于 1 时,您只想从 1,2 3 个月前的同一天和同一天从 ContractValue 中求和是否正确?
    • 我想从 ContractValue 中总结每 6 个月的合约价值。假设今天是 9 月 28 日,那么我希望查询提供从 4 月 28 日到 9 月 28 日的每份合约的总和。回顾过去,我想要从 3 月 28 日到 8 月 28 日以及从 2 月 28 日到 7 月 28 日的合同金额总和。通过这种方式,用户可以比较过去 6 个月内已签署(并且未取消,通过 ContractCancelled 字段检查)的合同数量(以货币计),并将其与一两个月前的情况进行比较。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-04-16
    • 1970-01-01
    • 1970-01-01
    • 2014-02-20
    • 2022-01-07
    • 2021-01-21
    • 1970-01-01
    相关资源
    最近更新 更多