2016-12-02 15 views
0

我正在嘗試執行INNER JOIN並用來自兩個表格的信息計數值。問題在於產品類別表格有多行具有相同或相似的值,因此我的COUNT()爲高。使用具有相同值的多行的表格

我的兩個表

銷售表

Date    prod_id 
    2016-01-01  81 
    2016-01-01  82 
    2016-01-01  81 
    2016-10-01  80 
    2016-01-01  80 
    2016-01-02  80 
    2016-01-02  80 
    2016-01-02  81 
    2016-01-02  81 
    ....    .... 

產品表

prodid   Name 
    80    Banana 
    81    Apple 
    82    Orange 
    83    Ice Cream 
    80    BANANAS 
    81    APPLE 
    82    
    83    Ice Cream 
    ....   .... 

當我做一個INNER JOIN和計數的例如出現的次數prod_id我得到一個不合理的數字,我的猜測是,這是因爲例如有不止一次出現。

您對解決方案有任何想法嗎?我的第一反應是重做Procuct表,但依賴於該表的許多其他系統,所以我無法在可預見的將來改變它。

我到目前爲止查詢:

SELECT 
pt.Date AS "Date", 
ft.Name AS "Product", 
COUNT(ft.Name) Number 
FROM SALES as pt 
INNER JOIN PROD_TABLE AS ft ON pt.prod_id=ft.prodid 
WHERE pt.Date BETWEEN '2016-01-01' AND '2016-01-30' 
GROUP BY pt.Date, ft.Name 
ORDER BY pt.Date DESC 

預期結果:

Date   Product  Number 
    2016-01-01 Banana  2 
    2016-01-01 Apple  2 
    2016-01-01 Orange  1 
+2

向我們展示預期結果和您當前的查詢嘗試。 – jarlh

回答

0

首先,你要修復數據。有一個重複的產品表似乎是不合情理的。你不應該嘗試通過編寫更復雜的查詢來解決這些問題。

這就是說,這在SQL Server中很容易實現。我認爲outer apply是合適的:

select p.name, count(*) 
from sales s outer apply (
    (select top 1 p.* 
     from product p 
     where p.name is not null and 
      p.prodid = s.prod_id -- note: the columns should have the same name 
    ) p; 
0

我想這簡單的查詢解決您的要求:

select 
      date, 
      name, 
      count(name) 
    from product p inner join sales s 
    on s.prod_id=p.prodid group by date,name 
0

簡單地通過一個子查詢,爲您提供獨一無二的產品編號的和名稱替換PROD_TABLE:

SELECT 
pt.Date, 
ft.Name AS "Product", 
COUNT(*) AS Number 
FROM SALES as pt 
LEFT JOIN (
     select prodid, min(Name) PROD_TABLE group by prodid 
) AS ft ON (pt.prod_id = ft.prodid) 
WHERE pt.Date BETWEEN '2016-01-01' AND '2016-01-30' 
GROUP BY pt.Date, ft.Name 
ORDER BY pt.Date DESC 

但是imho該PROD_TABLE真的應該清理。
prodid領域應該可能成爲首要關鍵。