2017-04-21 55 views
1


我最近更改了一些新表,並且無法從三個不同的表中獲取(選擇)數據。
有4家商店互相交換股票,它被記錄在數據庫中。

MYSQL以特定格式加入以獲取數據

'網站'有店鋪標識和名稱的信息。

CREATE TABLE `sites` (
`id` int(10) NOT NULL, 
`name` varchar(35) NOT NULL 
) 


表 'stock_exchange_new' 大約有股權轉讓最新信息,從 店,存儲等

CREATE TABLE `stock_exchange_new` (
`id` int(11) NOT NULL, 
`transfer_date` date NOT NULL, 
`from_site` int(11) NOT NULL, 
`to_site` int(11) NOT NULL, 
`transfer_ref` varchar(255) NOT NULL, 
`note` varchar(300) NOT NULL, 
`added_by` int(11) NOT NULL, 
`added_at` datetime NOT NULL, 
`edited_by` int(11) NOT NULL, 
`edited_at` datetime NOT NULL 
) 


表「stock_item_txns」有什麼項目是 交換傳輸的信息/:

CREATE TABLE `stock_item_txns` (
`id` int(11) NOT NULL, 
`stock_exchange_id` int(11) NOT NULL, 
`item_id` int(11) NOT NULL, 
`units_per_ctn` int(11) NOT NULL, 
`qty` decimal(10,2) NOT NULL, 
`ctn_price` decimal(10,2) NOT NULL, 
`total_price` decimal(10,2) NOT NULL 
) 

現在,對於一個特定的商店,我需要的比較本身顯示的數據,如:店鋪1,它應該是這樣的:

Store Name  Total_Sent  Total_Received 
Store2   500    200 
Store3   490    580 
Store4   300    400 

試過到目前爲止...

SELECT GREATEST(s1.name, s2.name) AS from_store, 
    LEAST(s1.name, s2.name) AS to_store, 
    SUM(CASE WHEN s1.name < s2.name THEN si.total_price ELSE 0 END) AS received, 
    SUM(CASE WHEN s1.name > s2.name THEN si.total_price ELSE 0 END) AS sent 
FROM stock_exchange_new se 
INNER JOIN sites s1 
ON se.from_site = s1.id 
INNER JOIN sites s2 
ON se.to_site = s2.id 
INNER JOIN stock_item_txns si 
ON se.id = si.stock_exchange_id 
GROUP BY GREATEST(se.from_site, se.to_site), 
LEAST(se.from_site, se.to_site) 
HAVING MAX(GREATEST(se.from_site, se.to_site)) = '1' 

這裏的fiddle,爲了更好的理解。

+0

固定錯字@Strawberry – sohal07

回答

1

利用幾個子查詢,像這樣(未測試): -

SELECT s2.name AS 'Store Name', 
     from_site_total, 
     to_site_total 
FROM sites s1 
CROSS JOIN sites s2 
LEFT OUTER JOIN 
(
    SELECT from_site, 
      to_site, 
      SUM(stock_item_txns.total_price) AS from_site_total 
    FROM stock_exchange_new 
    INNER JOIN stock_item_txns ON stock_exchange_new.id = stock_item_txns.stock_exchange_id 
    GROUP BY from_site, 
      to_site 
) sub_from_site 
ON s1.id = sub_from_site.from_site 
AND s2.id = sub_from_site.to_site 
LEFT OUTER JOIN 
(
    SELECT to_site, 
      from_site, 
      SUM(stock_item_txns.total_price) AS to_site_total 
    FROM stock_exchange_new 
    INNER JOIN stock_item_txns ON stock_exchange_new.id = stock_item_txns.stock_exchange_id 
    GROUP BY to_site, 
      from_site 
) sub_to_site 
ON s1.id = sub_to_site.to_site 
AND s2.id = sub_to_site.from_site 
WHERE s1.name = 'Store1' 
AND s2.name != 'Store1' 
+0

只是測試,但它可以導出位樣品返回除了Store3 – sohal07

+0

所有空數據,所以我可以自己調試它。 – Kickstart

+0

這裏有一些數據被轉儲的鏈接,我也更新了超鏈接。 http://sqlfiddle.com/#!9/4017c – sohal07