如何使用 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
我有以下表格:
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