简体   繁体   中英

SQL Table Solution With Calculating Different Columns in Same Table

I have a sql table like :

id    buy_product      buy_product_total     sell_product     sell_product_total
 1     apple                   5                  
 2     banana                  8
 3     cake                   20
 4                                                apple               1
 5                                                cake                2
 6     apple                   2

My problem is, I want to show product name and how many product left. Like :

product_name         left
     apple            6
     cake            18

How can I show like that solution with sql query ?

I create table as answerers as :

Buy Table

  id     product_name     total
   1       apple            5
   2       banana           8
   3       cake            20
   4       apple            2

Sell Table

   id      product_name     total
    1        apple            1
    2        cake             2

I want to table like this

   product_name            left
     apple                   6
     banana                  8
     cake                   18

Is not a good table, could be better that buy and sell to be the same collumn buy with positive values and sell with negative.

But answer your question, suppose that your table name is myTable, obs: you can execute every select separeted to understand better

select buy_product as product_name, (buy_total - sell_total) as left
from (
  (select buy_product, sum(buy_product_total) as buy_total 
    from myTable where buy_product_total is not null group by buy_product) as buy_list
  inner join
  (select sell_product, sum(sell_product_total) as sell_total 
    from myTable where sell_product_total is not null group by sell_product) as sell_list
  on buy_list.buy_product = sell_list.sell_product
)

You should consider a different database design that is more appropriate (You may want to read up on normalization), but query follows:

SELECT t1.buy_product_total - t2.sell_product_total
FROM ProductTable t1, ProductTable t2
WHERE t1.buy_product = t2.sell_product

ie You're joining the table to itself using a 'self join'...

As others have noted, your table structure is less than optimal.

However, given what you have, this will give you the results you're after.

 select product, sum(total) from 
 (
     select buy_product as product, buy_product_total as total 
     from yourtable 
     where buy_product is not null
     union
     select sell_product, -sell_product_total 
     from yourtable
     where sell_product is not null
 ) v
 group by product

Or, with your two tables

 select product_name, sum(total) from 
 (
     select product_name, total
     from buy_table
     union
     select product_name, -total 
     from sell_table
 ) v
 group by product_name

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM