簡體   English   中英

SQL分組依據和聚合在兩列中

[英]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

參見小提琴: http ://sqlfiddle.com/#!9/ 35a778/2

這可能會幫助您找到答案

  1. 移動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 
  2. 如果得到結果,則直接在MySQL中運行該部分查詢

  3. 如果得到結果,請在MySQL中運行完整的查詢

  4. 檢查您的PHP是否正確注入year參數,僅輸出生成的查詢代碼,然后嘗試在MySQL中運行

我到此為止,調試PHP並不是“我的事”

哦,與NULL對應的ANSI SQL等效函數只有一點是COALESCE()。 盡管在MySQL中IFNULL()很好,但我還是鼓勵您使用COALESCE(),但是您不必這樣做。

由於每月進行一些交易,而每年進行預算,因此,有某種方法可以“每月”分配預算。 同樣,要確保報告所有子類別和所有月份,請創建這些子類別的“笛卡爾積”,然后將數據與該類別合並。 最后,您還需要包括一種對數據進行合理排序的方法。 我希望從這個例子中您可以使其適應您的特定需求。

SQL小提琴

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM