如何使用 ROLLUP 为 mysql 中的一列创建超级聚合?

How do I use ROLLUP to create a super aggregate for only one column in mysql?

我有以下表格:

CREATE TABLE IF NOT EXISTS Business (
    Ticker        VARCHAR(255) NOT NULL UNIQUE,
    Company_Name  VARCHAR(255) NOT NULL UNIQUE,
    Currency      CHAR(3) NOT NULL,
    Portfolio     VARCHAR(255) NOT NULL,
    PRIMARY KEY ( Company_Name ),
    FOREIGN KEY ( Currency ) REFERENCES Currency ( Currency_Code ) ON UPDATE CASCADE ON DELETE CASCADE,
    FOREIGN KEY ( Portfolio ) REFERENCES Portfolio ( Portfolio_Name ) ON UPDATE CASCADE ON DELETE RESTRICT,
    CONSTRAINT CHK_Ticker CHECK ( Ticker = UPPER( Ticker ) )
);

CREATE TABLE IF NOT EXISTS Dividend (
    Dividend_ID           INTEGER NOT NULL UNIQUE AUTO_INCREMENT,
    Ticker             VARCHAR(255) NOT NULL,
    Dividend_Date         DATE NOT NULL,
    Dividend_Amount                 DOUBLE NOT NULL,
    SGD_XR                   DOUBLE NOT NULL,
    PRIMARY KEY ( Dividend_ID ),
    FOREIGN KEY ( Ticker ) REFERENCES Business ( Ticker ) ON UPDATE CASCADE ON DELETE CASCADE,
    CONSTRAINT CHK_SGD_XR CHECK ( SGD_XR >= 0 )
);

我想将这些表用于以下 Select:

SELECT
        IFNULL( Business.Company_Name,'Total Year To Date Dividends (SGD)' ) AS Company_Name,
        SUM(
            CASE WHEN Dividend.Dividend_Date >= STR_TO_DATE( CONCAT( '1 January ', YEAR(CURDATE()) ), '%d %M %Y' ) AND Dividend.Dividend_Date <= CURDATE() 
            THEN Dividend.Dividend_Amount 
            END) AS Year_To_Date_Dividends,
        SUM(
            CASE WHEN Dividend.Dividend_Date >= STR_TO_DATE( CONCAT( '1 January ', YEAR(CURDATE()) ), '%d %M %Y' ) AND Dividend.Dividend_Date <= CURDATE() 
            THEN Dividend.Dividend_Amount / Dividend.SGD_XR 
            END) AS SGD_Year_To_Date_Dividends
    FROM Business
    LEFT JOIN Dividend
        ON Business.Ticker = Dividend.Ticker
    GROUP BY Business.Company_Name WITH ROLLUP 

这里的问题是,对于应该由 Rollup 创建的“年初至今总股息 (SGD)”行,我只希望它计算 SGD_Year_To_Date_Dividends 列的总和,而不是Year_To_Date_Dividends 列(因为它们都以不同的货币表示,所以添加它们没有意义)。我不确定如何指定汇总以仅聚合 SGD_Year_To_Date_Dividends 列(并在 Year_To_Date_Dividends 中放置一个空值)。我该怎么做?

而不是:

    SUM(
        CASE WHEN Dividend.Dividend_Date >= STR_TO_DATE( CONCAT( '1 January ', YEAR(CURDATE()) ), '%d %M %Y' ) AND Dividend.Dividend_Date <= CURDATE() 
        THEN Dividend.Dividend_Amount 
        END) AS Year_To_Date_Dividends,

你会做:

    IF(Business.Company_Name IS NULL,'',SUM(
        CASE WHEN Dividend.Dividend_Date >= STR_TO_DATE( CONCAT( '1 January ', YEAR(CURDATE()) ), '%d %M %Y' ) AND Dividend.Dividend_Date <= CURDATE() 
        THEN Dividend.Dividend_Amount 
        END)) AS Year_To_Date_Dividends,

对于你的 SGD_Year_To_Date_Dividends,我怀疑你想要:

ROUND(Dividend.Dividend_Amount / Dividend.SGD_XR,2)

代替

Dividend.Dividend_Amount / Dividend.SGD_XR