我有2個(MySQL)表,exchitems交換表可以有1--n行,當一個交換記錄有多行時,我想顯示“多”這個詞,但是當只有1行時,我想顯示行的詳細資訊:
第一個表(交換):
xid (PK) | cusid | xdate | xref | xtotal
1 | 1 | 2021-10-01 | 345667 | 500
2 | 1 | 2021-10-01 | 345668 | 200
3 | 1 | 2021-10-02 | 345669 | 450
4 | 1 | 2021-10-03 | 345670 | 1200
第二個表(exchitems):
chid (PK) | xid | cusid | xcur| xsell| xbuy
1 | 1 | 1 | USD | 300 | 0
2 | 1 | 1 | EUR | 0 | 400
3 | 2 | 1 | USD | 200 | 0
4 | 3 | 1 | EUR | 0 | 500
5 | 4 | 1 | EUR | 0 | 800
6 | 4 | 1 | USD | 300 | 0
該交換表必須有至少1排exchtiems表,這是我想獲得:
xid | cusid | xdate | xref | xcur | xsell | xbuy | xtotal
1 | 1 | 2021-10-01 | 345667 | multi | 0 | 0 | 500
2 | 1 | 2021-10-01 | 345668 | USD | 200 | 0 | 200
3 | 1 | 2021-10-02 | 345669 | EUR | 0 | 500 | 450
4 | 1 | 2021-10-03 | 345670 | multi | 0 | 0 | 1200
使用以下查詢,我能夠獲取所有記錄,但是當有多行時,我想將 exchitems 表限制為一行“任何行”,計數用于顯示單詞“multi” > 1:
SELECT a.xid,a.xdate,a.xref,a.xtotal,b.xcur,b.xsell,b.xbuy,
(SELECT COUNT(*) FROM exchitems c WHERE c.xid= a.xid) AS tRec
FROM (exchange a
INNER JOIN exchitems b ON a.xid= b.xid AND a.cusid= b.cusid)
WHERE a.cusid = 1
ORDER BY a.xdate DESC,a.xid DESC
我嘗試了許多不同的查詢,但無法實作我想要的。
任何幫助都受到高度贊賞。
uj5u.com熱心網友回復:
未經測驗,但這應該有效。
SELECT
a.xid,
a.cusid,
a.xdate,
a.xref,
-- if distinct currency in the group is > 1 then the word 'multi', else currency.
IF(COUNT(DISTINCT b.xcur) > 1, 'multi', b.xcur) AS `xcur`,
b.xsell,
b.xbuy,
a.xtotal
FROM exchange a
JOIN exchitems b ON a.xid = b.xid AND a.cusid = b.cusid
WHERE a.cusid = 1
GROUP BY xid -- will let you have exchange rows with groups of exchitems 1:n
ORDER BY a.xdate DESC, a.xid DESC
uj5u.com熱心網友回復:
您可以將當前查詢修改為以下內容:
SELECT a.xid, a.cusid, a.xdate,
a.xref,
GROUP_CONCAT(b.xcur),
MIN(b.xsell),
MIN(b.xbuy),
MAX(a.xtotal)
FROM (exchange a
INNER JOIN exchitems b ON a.xid= b.xid AND a.cusid= b.cusid)
WHERE a.cusid = 1
GROUP BY a.xid,a.cusid,a.xdate,a.xref
ORDER BY a.xid;
結果將如下所示:
| xid | 客戶 | 日期 | 外部參照 | GROUP_CONCAT(b.xcur) | MIN(b.xsell) | MIN(b.xbuy) | MAX(a.xtotal) |
|---|---|---|---|---|---|---|---|
| 1 | 1 | 2021-10-01 | 345667 | 美元、歐元 | 0 | 0 | 500 |
| 2 | 1 | 2021-10-01 | 345668 | 美元 | 200 | 0 | 200 |
| 3 | 1 | 2021-10-02 | 345669 | 歐元 | 0 | 500 | 450 |
| 4 | 1 | 2021-10-03 | 345670 | 歐元、美元 | 0 | 0 | 1200 |
我使用MIN和使用的部分MAX是根據您的預期結果。您可能想澄清要顯示的值是多個值。如果我將其更改為GROUP_CONCAT:
SELECT a.xid, a.cusid, a.xdate,
a.xref,
GROUP_CONCAT(b.xcur),
GROUP_CONCAT(b.xsell),
GROUP_CONCAT(b.xbuy),
GROUP_CONCAT(a.xtotal)
FROM (exchange a
INNER JOIN exchitems b ON a.xid= b.xid AND a.cusid= b.cusid)
WHERE a.cusid = 1
GROUP BY a.xid,a.cusid,a.xdate,a.xref
ORDER BY a.xid;
然后你會看到一個更精細的結果:
| xid | 客戶 | 日期 | 外部參照 | GROUP_CONCAT(b.xcur) | GROUP_CONCAT(b.xsell) | GROUP_CONCAT(b.xbuy) | GROUP_CONCAT(a.xtotal) |
|---|---|---|---|---|---|---|---|
| 1 | 1 | 2021-10-01 | 345667 | 美元、歐元 | 300,0 | 0,400 | 500,500 |
| 2 | 1 | 2021-10-01 | 345668 | 美元 | 200 | 0 | 200 |
| 3 | 1 | 2021-10-02 | 345669 | 歐元 | 0 | 500 | 450 |
| 4 | 1 | 2021-10-03 | 345670 | 歐元、美元 | 0,300 | 800,0 | 1200,1200 |
要使xcur值顯示multi,您可能可以執行以下操作:
SELECT a.xid, a.cusid, a.xdate,
CASE WHEN COUNT(b.xcur) > 1 THEN 'multi' ELSE MAX(b.xcur) END AS xcur,
MIN(b.xsell),
MIN(b.xbuy),
MAX(a.xtotal)
FROM (exchange a
INNER JOIN exchitems b ON a.xid= b.xid AND a.cusid= b.cusid)
WHERE a.cusid = 1
GROUP BY a.xid,a.cusid,a.xdate,a.xref
ORDER BY a.xid;
演示小提琴
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/328744.html
