2015-07-05 71 views
2

我試圖獲得一段特定時間內銷售的產品數量。對於這個例子:產品表有一個數量字段,每當某個產品銷售時它就會增加。訂單表具有開始日期和結束日期。有沒有一種方法可以在我的訂單表中保存產品表(如對象)的引用,以便我可以看到每個產品每次開始 - 結束日期的售出數量?一個簡單的例子:我有2個產品: 1 bike 25000 32 sportbike 30000 5出售我的日期。所以訂單將會是這樣的:1 05.07.2015 05.07.2015和那些產品。MYSQL引用另一個表字段

CREATE TABLE products (
    product_no integer PRIMARY KEY, 
    name varchar(20), 
    price float, 
    quantity integer, 
); 

CREATE TABLE sells (
    sell_id integer PRIMARY KEY, 
    start_date date, 
    end_date date  
); 

//新的想法:

CREATE TABLE products (
     product_no integer PRIMARY KEY, 
     name varchar(20), 
     price float 
    ); 

CREATE TABLE sells (
     sell_id integer PRIMARY KEY, 
     date date, 
     quantity integer, 
     product_id integer FOREIGN KEY 
    ); 
+0

你的意思是像一個包含'order_id',一個'product_no',一個'quantity',也許'price'的'OrderLines'表?該表可以保存每個訂單銷售的產品,然後您可以查詢哪些產品在哪些日期銷售。儘管如此,我並沒有真正獲得開始日期和結束日期。我認爲產品訂單隻有一個日期。 – GolezTrol

+0

是的。這些日期的要點是,我需要看看每天有多少x和y產品已經售出。如果你能給我一個更好的想法如何做到這一點,我將不勝感激。 – Ann

+0

我想我只是做了。 :)對我而言,訂單是您訂購產品的唯一時刻,包含日期和可能的客戶參考。 OrderLine包含該訂單和產品之間的鏈接。如果客戶訂購多個產品,訂單可以有多個訂單行。要獲得某天銷售的產品,請編寫一個查詢,以獲取當天的所有訂單(或所有訂單在日期範圍內),並在訂單行上加入訂單,以便您可以按照每種產品進行結算。我會在答案中加上這一點,但我現在只是提出一個解決方案,因爲我不確定我完全理解了這個問題。 – GolezTrol

回答

0

除非有命令始終是一個單一的產品,我想你會需要第三個表。對我來說,這種情況最少的*)的數據模型是這樣的:

CREATE TABLE products (
    product_no integer PRIMARY KEY, 
    name varchar(20) not null, 
    price float, 
    quantity_on_stock integer not null 
); 

CREATE TABLE orders (
    order_id integer PRIMARY KEY, 
    order_date date not null 
); 

CREATE TABLE orderlines (
    order_id integer not null REFERENCES orders.order_id, 
    product_no integer REFERENCES products.product_no, 
    price integer, 
    quantity integer not null, 
    PRIMARY KEY(order_id, product_no) 
); 

然後,查詢來獲取銷售在一定時期可能看起來像這樣:

select 
    p.product_no, 
    p.name, 
    sum(ol.quantity) 
from 
    products p 
    inner join orderlines ol on ol.product_no = p.product_no 
    inner join orderlines o on o.order_id = ol.order_id 
where 
    ol.order_date between :start_date and :end_date 

*)我說最小限度,但實際上並不輕微。你可能會想保存發票過,或者至少某種指示,指出訂單是否真正所許並交付,因爲有時訂單被取消,或只是在等待開放。

+0

我不知道內部連接做什麼,因爲我是新來的MySQL。但是,這不是我最後的評論嗎?你寫的最後一部分? – Ann

+0

另一個問題是,如果那一天實際上位於桌子的底部,那麼我需要很長時間才能將總量賣給一天,並且我已經擁有10萬條線了?我怎樣才能防止呢? – Ann

+0

表之間存在差異,在這些表中實際存儲的數據儘可能結構化(並儘可能減少冗餘),以及可將表數據組合爲特定時間可能需要的表單的查詢。因此,要獲得全部產品銷售量,您可以使用查詢將訂單和訂單行中的單個銷售額讀取到每個產品的總額中。該查詢結果是根據表日期計算的,但它本身不是表數據,也不存儲在數據庫中。 – GolezTrol

0

你一定要一個sales表顯示所銷售的產品以及何時,而不是一個圖表,顯示正在運行的庫存。

它是很多在SQL中更容易聚合詳細信息以創建運行總計,而不是重建運行總計中的詳細信息。

所以,如果你碰巧有一個sales表含,除其他事項外,列product_idquantity,並ts(出售的時間戳),那麼你可以通過product_id和銷售日期一樣獲得銷售的摘要這個。

SELECT product_id, 
     DATE(ts) AS salesdate, 
     SUM(quantity) AS quantity 
    FROM sales 
WHERE ts >= :start_date 
    AND ts < :end_date + INTERVAL 1 DAY 
GROUP BY DATE(ts), product_id 

一個太酷了約,這是你能爲transaction_type添加列此表的東西。如果客戶退回產品,則將其標記爲return並使用負數量。如果您的店鋪收到一批貨物,則將其標記爲restock,並使用負數量。然後,如果您想要顯示淨銷售額 - 銷售額較少的退貨產品 - 這對查詢只是一個小改動。

SELECT product_id, 
     DATE(ts) AS salesdate, 
     SUM(quantity) AS quantity 
    FROM sales 
WHERE ts >= :start_date 
    AND ts < :end_date + INTERVAL 1 DAY 
    AND transaction_type IN ('sale', 'return') 
GROUP BY DATE(ts), product_id 

如果你想知道你有多麼的股票對手頭每個產品特定END_DATE,你這樣做(從一開始的時候開始)。

SELECT product_id, 
     SUM(quantity) AS quantity 
    FROM sales 
GROUP BY product_id 

在實際庫存/銷售系統,它的共同清點一年一次,收出上一年的銷售表,並開始一個新的針對每個產品的起始值。這也是常見的sales_ordersales_detail組織銷售,這樣你就可以跟蹤銷售在每筆交易的多個項目。

相關問題