2015-08-25 41 views
-1

我有兩個表:添加列查詢基於對先前查詢

+-----------+ 
| Customer | 
+-----------+ 
| ID | Name | 
+----+------+ 
| 1 | Jack | 
+----+------+ 
| 2 | John | 
+----+------+ 

+----------------------------------------+ 
|     Bill     | 
+----------------------------------------+ 
| ID | Customer_ID | date  | amount | 
+----+-------------+------------+--------+ 
| 1 | 1   | 01.01.2015 | 10$ | 
+----+-------------+------------+--------+ 
| 2 | 1   | 01.01.2014 | 20$ | 
+----+-------------+------------+--------+ 
| 3 | 2   | 01.01.2015 | 5$  | 
+----+-------------+------------+--------+ 
| 4 | 2   | 01.02.2015 | 50$ | 
+----+-------------+------------+--------+ 
| 5 | 2   | 01.01.2014 | 15$ | 
+----+-------------+------------+--------+ 

我需要知道所有的賬單客戶在一年內拿到的總和。

這很簡單:

SELECT 
    SUM(Bill.amount), Customer.Name 
FROM 
    Customer 
INNER JOIN 
    Bill ON Customer.ID = Bill.Customer_ID 
WHERE 
    Bill.date BETWEEN #20150101# AND #20151231# 
GROUP BY 
    Customer.Name 

困難的部分是,我需要在一個表,以顯示查詢多年的結果是這樣的:

+-------------------------------------------+ 
|    sales to customer    | 
+-------------------------------------------+ 
| Customer_ID | Customer_Name | 2015 | 2014 | 
+-------------+---------------+------+------+ 
| 1   | jack   | 10$ | 20$ | 
+-------------+---------------+------+------+ 
| 2   | john   | 55$ | 20$ | 
+-------------+---------------+------+------+ 

我使用SQL Server 2005.

我非常感謝每一個答案。

誠懇 Andahari

+1

這就是我們所說的擺動被table..you轉置表.. –

+0

你的日期字段存儲爲哪種格式? –

+0

不要存儲'$' - 並且絕對不要將其與數字值存儲在同一列中!!!!!!!!!!! – Strawberry

回答

1

如前所述,你需要以達到你正在尋找的結果,像這樣使用PIVOT:

Select Customer_ID, Customer_Name, [2015], [2014] 
from 
(select Customer_ID, Name Customer_Name, YEAR(_date) Yr, amount 
from Bill b 
inner join Customer c on c.ID = b.Customer_ID 
) as src 
PIVOT 
(SUM(amount) for Yr in ([2015],[2014])) as pvt 
+0

標記是MySQL,而不是MS SQL Server。 –

+0

MySQL標籤是一個錯誤,他只是這麼說的。它的標籤SQL-SERVER –

+0

好的,我現在看到它。你的回答值得讚賞。 –

1

使用對應於您的時間只和值的情況下。例如:

SELECT sum(case when Bill.date BETWEEN #20150101# AND #20151231# then Bill.amount else 0 end) as 2015, 
Customer.Name 
    FROM Customer INNER JOIN Bill ON Customer.ID = Bill.Customer_ID 
    GROUP BY Customer.Name 
+0

OP想要顯示數據多年你的答案不符合OP的問題。 –

+0

@MaciejLos更改過濾器?它完全迴應OP的問題,並舉例說明。它也使用sql標準和沒有子查詢,使得它既有效,也與所有sql風格兼容。 – AdrianBR