2017-02-24 54 views
2

您好,我需要幫助來解決我的代碼。Php mysql根據日期加入羣組

我試過以下查詢;

SELECT DATE_FORMAT(buy.date, '%Y-%m-%d') date 
    , SUM(buy.total) sumbuy 
    , SUM(sell.total) sumsell 
    FROM buy 
    JOIN sell 
    ON DATE_FORMAT(buy.date, '%Y-%m-%d') = DATE_FORMAT(sell.date,'%Y-%m-%d') 
WHERE buy.trans = 'credit' 
    AND sell.trans= 'debit' 
GROUP 
    BY DATE_FORMAT(buy.date, '%d') 

結果是:

date  sumbuy  sumsell 
------------------------------------ 
2017-02-01 1560000  8080000 

我的預期是:

 date  sumbuy  sumsell 
    ------------------------------------ 
    2017-02-01  390000  2020000 

這裏查看完整表

total   trans   date 
----------------------------------------------- 
140000   credit  2017-02-01 04:31:00 
50000   credit  2017-02-01 04:32:00 
190000   debit  2017-02-01 04:33:00 
50000   credit  2017-02-01 04:34:00 
150000   credit  2017-02-01 04:35:00 

total   trans   date 
    ------------------------------------------ 
    120000   debit 2017-02-01 04:31:00 
    300000   debit 2017-02-01 04:32:00 
    800000   debit 2017-02-01 04:33:00 
    800000   debit 2017-02-01 04:35:00 

請任何人能幫助我解決這個問題。

+2

這似乎令人困惑我有一個購買表和銷售表,以及可以是借方和貸方的跨欄。看,我很困惑。爲什麼不只是有一張桌子? – Strawberry

+0

我需要兩個表爲我的項目,這是爲例,所以我使它如此簡單,:D –

+0

爲什麼你需要兩個表?您可以按類型推遲交易。 –

回答

0

'沒辦法讓它成爲一張桌子' - 這種說法是坦率的荒謬。

反正...

DROP TABLE IF EXISTS buy; 

CREATE TABLE buy 
(total INT NOT NULL 
,trans enum('credit','debit') 
,date DATETIME NOT NULL); 

INSERT INTO buy VALUES 
(140000,'credit','2017-02-01 04:31:00'), 
(50000,'credit','2017-02-01 04:32:00'), 
(190000,'debit' ,'2017-02-01 04:33:00'), 
(50000,'credit','2017-02-01 04:34:00'), 
(150000,'credit','2017-02-01 04:35:00'); 

DROP TABLE IF EXISTS sell; 

CREATE TABLE sell 
(total INT NOT NULL 
,trans enum('credit','debit') 
,date DATETIME NOT NULL); 

INSERT INTO sell VALUES 
(120000,'debit','2017-02-01 04:31:00'), 
(300000,'debit','2017-02-01 04:32:00'), 
(800000,'debit','2017-02-01 04:33:00'), 
(800000,'debit','2017-02-01 04:35:00'); 

SELECT DATE(date) date 
    , SUM(CASE WHEN type = 'buy' AND trans = 'credit' THEN total END) sumbuy 
    , SUM(CASE WHEN type = 'sell' AND trans = 'debit' THEN total END) sumsell 
    FROM 
    (SELECT * 
      ,'buy' type 
     FROM buy 
     UNION 
      ALL 
     SELECT * 
      ,'sell' 
     FROM sell 
    ) x 
GROUP 
    BY DATE(date); 
+------------+--------+---------+ 
| date  | sumbuy | sumsell | 
+------------+--------+---------+ 
| 2017-02-01 | 390000 | 2020000 | 
+------------+--------+---------+ 
1 row in set (0.02 sec) 

SQLfiddle

+1

和@strawberry再次擊敗我,仍然努力尋找更好的解決方案,也許我需要改變我的暱稱爲[tag:apple]? – davejal

+0

好,非常有幫助的答案。非常感謝你草莓。 –

+0

@strawberry,在這種情況下只有很少的記錄,但是如果記錄很多,哪種解決方案工作得更快? – davejal

0

已經解決你的問題,但也許這一個可以幫助其他人在另一種情況

select date, sum(sumbuy) as totalbuy, sum(sumsell) as totalsell from (SELECT DATE_FORMAT(buy.date, '%Y-%m-%d') date 
    , SUM(case when trans = 'credit' then total else 0 end) as sumbuy 
    , SUM(case when trans = 'debit' then total else 0 end) as sumsell 
    FROM buy 
    GROUP 
    BY DATE_FORMAT(buy.date, '%d') 
union 
SELECT DATE_FORMAT(sell.date, '%Y-%m-%d') date 
    , SUM(case when trans = 'credit' then total else 0 end) as sumbuy 
    , SUM(case when trans = 'debit' then total else 0 end) as sumsell 
    FROM sell 
    GROUP 
    BY DATE_FORMAT(sell.date, '%d')) a 
    group by date 

我注意到你有2020000 sumsell的,不應該是還是你會嘿嘿,不想從購買表中借記交易?

如果你只是想從銷售表從買表的借方和唯一的信用,你可以重寫查詢是這樣的:

select date, sum(sumbuy) as totalbuy, sum(sumsell) as totalsell from (SELECT DATE_FORMAT(buy.date, '%Y-%m-%d') date 
, SUM(case when trans = 'credit' then total else 0 end) as sumbuy 
, SUM(case when trans = 'debit' then total else 0 end) as sumsell 
    FROM buy 
where trans = 'credit' 
GROUP 
BY DATE_FORMAT(buy.date, '%d') 
union 
SELECT DATE_FORMAT(sell.date, '%Y-%m-%d') date 
, SUM(case when trans = 'credit' then total else 0 end) as sumbuy 
, SUM(case when trans = 'debit' then total else 0 end) as sumsell 
FROM sell 
where trans = 'debit' 
GROUP 
BY DATE_FORMAT(sell.date, '%d')) a 
group by date 

sqlfiddle