2017-04-21 52 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