[英]SQL group by and aggregation in two columns
這是我之前的問題的后續工作,由@Barmar很好地回答: 在Year(date)和Month(date)上使用MYSQL GROUP BY WITH ROLLUP時,我無法將Null更改為“ Total”
我有一個SQL查詢,從我的交易 ,subkategori和表駕駛員學校獲取數據,並能正常工作。 但是現在我想添加預算表並匯總預算金額。 我的方法如下:
$stmt = $dbh->prepare("
SELECT IFNULL(Year, 'All') AS Year,
IFNULL(Month, 'All') AS Month,
IFNULL(Kategori,'All') AS Kategori,
IFNULL(Subkategori,'All') AS Subkategori,
Belopp,
Budget
FROM (
SELECT YEAR(transaktioner.datum) AS Year,
MONTH(transaktioner.datum) AS Month,
kategori.kat_namn AS Kategori,
subkategori.subkat_namn AS Subkategori,
SUM(transaktioner.belopp) AS Belopp,
SUM(budget.budgetedAmmount) AS Budget
FROM subkategori
LEFT JOIN transaktioner
ON subkategori.subkat_id=transaktioner.subkat_id
LEFT JOIN kategori
ON subkategori.kat_id = kategori.kat_id
LEFT JOIN budget
ON subkategori.subkat_id = budget.subkat_id
GROUP BY Year, Month, Kategori, Subkategori
WITH ROLLUP
) AS x
WHERE Year =".$year."
");
它給了我一個null
輸出。 有人可以幫我嗎?
表格如下:
轉譯者
id
datum
beskrivning
overforing
belopp
balans
subkat_id
konto_id
latest_update
ori
kat_id
kat_namn
type
latest_update
子立
subkat_id
subkat_namn
kat_id
latest_update
預算表
budget_id
subkat_id
budgetedAmmount
user_id
year
期望結果表
Year Month Kategory Subkategory Spent Budget
2017 1 Kat1 Subkat1 1000 500
2017 1 Kat1 Subkat2 500 250
2017 1 kat1 ALL 1500 750
2017 1 Kat2 Subkat1 2000 1000
2017 1 Kat2 Subkat2 450 500
2017 1 kat2 ALL 2450 1500
2017 1 ALL ALL 3950 2250
ALL ALL ALL ALL 3950 2250
這可能會幫助您找到答案
移動where子句
SELECT YEAR(transaktioner.datum) AS Year, MONTH(transaktioner.datum) AS Month, kategori.kat_namn as Kategori, subkategori.subkat_namn as Subkategori, SUM(transaktioner.belopp) AS Belopp, SUM(budget.budgetedAmmount) AS Budget FROM subkategori Left JOIN transaktioner ON subkategori.subkat_id=transaktioner.subkat_id Left JOIN kategori ON subkategori.kat_id = kategori.kat_id LEFT JOIN budget ON subkategori.subkat_id = budget.subkat_id > here >> WHERE ??? GROUP BY Year, Month,Kategori,Subkategori WITH ROLLUP
如果得到結果,則直接在MySQL中運行該部分查詢
如果得到結果,請在MySQL中運行完整的查詢
檢查您的PHP是否正確注入year參數,僅輸出生成的查詢代碼,然后嘗試在MySQL中運行
我到此為止,調試PHP並不是“我的事”
哦,與NULL對應的ANSI SQL等效函數只有一點是COALESCE()。 盡管在MySQL中IFNULL()很好,但我還是鼓勵您使用COALESCE(),但是您不必這樣做。
由於每月進行一些交易,而每年進行預算,因此,有某種方法可以“每月”分配預算。 同樣,要確保報告所有子類別和所有月份,請創建這些子類別的“笛卡爾積”,然后將數據與該類別合並。 最后,您還需要包括一種對數據進行合理排序的方法。 我希望從這個例子中您可以使其適應您的特定需求。
MySQL 5.6模式設置 :
-- Create transaktioner
CREATE TABLE transaktioner
(`id` varchar(4),
`datum` date,
`beskrivning` varchar(8),
`overforing` varchar(8),
`belopp` varchar(8),
`balans` varchar(8),
`subkat_id` varchar(8),
`konto_id` varchar(8)
);
INSERT INTO transaktioner
( `datum`,`beskrivning`,`overforing`,`belopp`,`balans`,`subkat_id`,`konto_id`)
VALUES
("2017-01-01","Test1","Yes",'1000','1200','1','1111'),
("2016-01-01","Test1","Yes",'1000','1200','2','1111');
-- Create Kategori Table
CREATE TABLE kategori
(`kat_id` varchar(4),`kat_namn` varchar(10));
INSERT INTO kategori
( `kat_id`,`kat_namn`)
VALUES
('1',"Kat1"),
('2',"Kat2"),
('3',"Kat3"),
('4',"Kat4");
-- Create Subkategori Table
CREATE TABLE subkategori
(`subkat_id` varchar(4),`kat_id` varchar(4),`subkat_namn` varchar(10));
INSERT INTO subkategori
( `subkat_id`,`kat_id`,`subkat_namn`)
VALUES
('1','1',"subKat1"),
('2','1',"subKat2"),
('3','1',"subKat3"),
('4','1',"subKat4");
-- Create budget Table
CREATE TABLE budget
(`budget_id` varchar(4),`subkat_id` varchar(4),`budgetedAmmount` varchar(10), `year` varchar(4));
INSERT INTO budget
( `budget_id`,`subkat_id`,`budgetedAmmount`,`year`)
VALUES
('1','1',"111",'2017'),
('2','2',"222",'2017'),
('3','3',"333",'2017'),
('4','4',"444",'2017'),
('1','1',"111",'2016'),
('2','2',"222",'2016'),
('3','3',"333",'2016'),
('4','4',"444",'2016');
查詢1 :
SELECT
IFNULL(Year, 'All') AS Year
, IFNULL(Month, 'All') AS Month
, IFNULL(Kategori,'All') AS Kategori
, IFNULL(Subkategori,'All') AS Subkategori
, IFNULL(Belopp,0) AS Belopp
, IFNULL(Budget,0) AS Budget
FROM (
SELECT
y.year AS year
, m.n AS month
, kategori.kat_namn AS kategori
, subkategori.subkat_namn AS subkategori
, SUM(IFNULL(transaktioner.belopp,0)) AS belopp
, SUM(IFNULL(b.budgetedAmmount,0)) AS budget
FROM subkategori
INNER JOIN kategori ON subkategori.kat_id = kategori.kat_id
CROSS JOIN (
SELECT 2017 year
) y
CROSS JOIN (
SELECT 1 n union all SELECT 2 n union all SELECT 3 n union all SELECT 4 n union all
SELECT 5 n union all SELECT 6 n union all SELECT 7 n union all SELECT 8 n union all
SELECT 9 n union all SELECT 10 union all SELECT 11 union all SELECT 12
) m
LEFT JOIN transaktioner ON subkategori.subkat_id = transaktioner.subkat_id
AND y.year = YEAR(transaktioner.datum)
AND m.n = MONTH(transaktioner.datum)
LEFT JOIN (
SELECT subkat_id, Year, budgetedAmmount/12 as budgetedAmmount
FROM budget
) b ON subkategori.subkat_id = b.subkat_id
AND y.year = b.year
GROUP BY
y.year
, m.n
, kategori.kat_namn
, subkategori.subkat_namn
WITH ROLLUP
) d
ORDER BY
IFNULL(Year, 9999)
, IFNULL(Month, 13)
, IFNULL(Kategori,'zzzzzzzzz')
, IFNULL(Subkategori,'zzzzzzzzzzz')
;
結果 :
| Year | Month | Kategori | Subkategori | Belopp | Budget |
|------|-------|----------|-------------|--------|--------|
| 2017 | 1 | Kat1 | subKat1 | 1000 | 9.25 |
| 2017 | 1 | Kat1 | subKat2 | 0 | 18.5 |
| 2017 | 1 | Kat1 | subKat3 | 0 | 27.75 |
| 2017 | 1 | Kat1 | subKat4 | 0 | 37 |
| 2017 | 1 | Kat1 | All | 1000 | 92.5 |
| 2017 | 1 | All | All | 1000 | 92.5 |
| 2017 | 2 | Kat1 | subKat1 | 0 | 9.25 |
| 2017 | 2 | Kat1 | subKat2 | 0 | 18.5 |
| 2017 | 2 | Kat1 | subKat3 | 0 | 27.75 |
| 2017 | 2 | Kat1 | subKat4 | 0 | 37 |
| 2017 | 2 | Kat1 | All | 0 | 92.5 |
| 2017 | 2 | All | All | 0 | 92.5 |
| 2017 | 3 | Kat1 | subKat1 | 0 | 9.25 |
| 2017 | 3 | Kat1 | subKat2 | 0 | 18.5 |
| 2017 | 3 | Kat1 | subKat3 | 0 | 27.75 |
| 2017 | 3 | Kat1 | subKat4 | 0 | 37 |
| 2017 | 3 | Kat1 | All | 0 | 92.5 |
| 2017 | 3 | All | All | 0 | 92.5 |
| 2017 | 4 | Kat1 | subKat1 | 0 | 9.25 |
| 2017 | 4 | Kat1 | subKat2 | 0 | 18.5 |
| 2017 | 4 | Kat1 | subKat3 | 0 | 27.75 |
| 2017 | 4 | Kat1 | subKat4 | 0 | 37 |
| 2017 | 4 | Kat1 | All | 0 | 92.5 |
| 2017 | 4 | All | All | 0 | 92.5 |
| 2017 | 5 | Kat1 | subKat1 | 0 | 9.25 |
| 2017 | 5 | Kat1 | subKat2 | 0 | 18.5 |
| 2017 | 5 | Kat1 | subKat3 | 0 | 27.75 |
| 2017 | 5 | Kat1 | subKat4 | 0 | 37 |
| 2017 | 5 | Kat1 | All | 0 | 92.5 |
| 2017 | 5 | All | All | 0 | 92.5 |
| 2017 | 6 | Kat1 | subKat1 | 0 | 9.25 |
| 2017 | 6 | Kat1 | subKat2 | 0 | 18.5 |
| 2017 | 6 | Kat1 | subKat3 | 0 | 27.75 |
| 2017 | 6 | Kat1 | subKat4 | 0 | 37 |
| 2017 | 6 | Kat1 | All | 0 | 92.5 |
| 2017 | 6 | All | All | 0 | 92.5 |
| 2017 | 7 | Kat1 | subKat1 | 0 | 9.25 |
| 2017 | 7 | Kat1 | subKat2 | 0 | 18.5 |
| 2017 | 7 | Kat1 | subKat3 | 0 | 27.75 |
| 2017 | 7 | Kat1 | subKat4 | 0 | 37 |
| 2017 | 7 | Kat1 | All | 0 | 92.5 |
| 2017 | 7 | All | All | 0 | 92.5 |
| 2017 | 8 | Kat1 | subKat1 | 0 | 9.25 |
| 2017 | 8 | Kat1 | subKat2 | 0 | 18.5 |
| 2017 | 8 | Kat1 | subKat3 | 0 | 27.75 |
| 2017 | 8 | Kat1 | subKat4 | 0 | 37 |
| 2017 | 8 | Kat1 | All | 0 | 92.5 |
| 2017 | 8 | All | All | 0 | 92.5 |
| 2017 | 9 | Kat1 | subKat1 | 0 | 9.25 |
| 2017 | 9 | Kat1 | subKat2 | 0 | 18.5 |
| 2017 | 9 | Kat1 | subKat3 | 0 | 27.75 |
| 2017 | 9 | Kat1 | subKat4 | 0 | 37 |
| 2017 | 9 | Kat1 | All | 0 | 92.5 |
| 2017 | 9 | All | All | 0 | 92.5 |
| 2017 | 10 | Kat1 | subKat1 | 0 | 9.25 |
| 2017 | 10 | Kat1 | subKat2 | 0 | 18.5 |
| 2017 | 10 | Kat1 | subKat3 | 0 | 27.75 |
| 2017 | 10 | Kat1 | subKat4 | 0 | 37 |
| 2017 | 10 | Kat1 | All | 0 | 92.5 |
| 2017 | 10 | All | All | 0 | 92.5 |
| 2017 | 11 | Kat1 | subKat1 | 0 | 9.25 |
| 2017 | 11 | Kat1 | subKat2 | 0 | 18.5 |
| 2017 | 11 | Kat1 | subKat3 | 0 | 27.75 |
| 2017 | 11 | Kat1 | subKat4 | 0 | 37 |
| 2017 | 11 | Kat1 | All | 0 | 92.5 |
| 2017 | 11 | All | All | 0 | 92.5 |
| 2017 | 12 | Kat1 | subKat1 | 0 | 9.25 |
| 2017 | 12 | Kat1 | subKat2 | 0 | 18.5 |
| 2017 | 12 | Kat1 | subKat3 | 0 | 27.75 |
| 2017 | 12 | Kat1 | subKat4 | 0 | 37 |
| 2017 | 12 | Kat1 | All | 0 | 92.5 |
| 2017 | 12 | All | All | 0 | 92.5 |
| 2017 | All | All | All | 1000 | 1110 |
| All | All | All | All | 1000 | 1110 |
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.