2016-01-31 270 views
0

我有一個表,其中我列SUM其中一列「金額」。然後我想從中減去一個特定的數字,然後用CASE THEN創建另一個列。我可以在while循環中用if來成功執行它,但客戶端希望能夠對結果進行排序。我並不擅長查詢,但試圖學習。以下是我在這裏查看所有問題的想法。這會工作嗎?SQL CASE THEN語句

SELECT 
    accountNumber, 
    accountName, 
    sectorID, 
    territoryID, 
    regionID, 
    SUM(amount) AS totalSales 
    SELECT 
     CASE WHEN totalSales < 1001.00 THEN 1001.00 - totalSales 
      WHEN totalSales < 2501.00 THEN 2501.00 - totalSales 
      WHEN totalSales < 5001.00 THEN 5001.00 - totalSales 
      WHEN totalSales < 10001.00 THEN 10001.00 - totalSales 
      WHEN totalSales < 15001.00 THEN 15001.00 - totalSales 
     END AS needed 
FROM 
    tblsales 
GROUP BY 
    accountName 
ORDER BY 
    accountName ASC  
+0

不能使用'totalSales'。 Jut使用'SUM(amount)'代替。 –

+0

這是它的小提琴。 http://sqlfiddle.com/#!9/60d4b/2 –

+0

哪個RDBMS是爲了這個?請添加一個標籤來指定您是使用'mysql','postgresql','sql-server','oracle'還是'db2' - 或者其他的東西。 –

回答

1

有些靈活性呢?想象一下,你需要改變/擴展/等。你的利潤...... 我建議將它們放到一個單獨的表:

create table margins(m_from int, m_to int); 

insert into margins values 
(0, 2501),(2501, 5001),(5001, 10001),(10001,15001),(15001,20001); 

所以,現在你的代碼會像下面,你將不必更改它,當你的利潤將被改變:

select v.*, m.m_to - totalSales as needed from (
SELECT 
    accountNumber, accountName, sectorID, territoryID, regionID, SUM(amount) AS totalSales 
FROM tblsales 
GROUP BY accountName) as v 
join margins m 
on (totalSales >= m_from and totalSales < m_to) 
ORDER BY accountName; 

這裏是你的位修改sqlfiddle

+0

感謝MaxU,正是程序員所訂購的。 –

1

您不能在其定義的SELECT中引用列別名。你有一個非常簡單的表達式,所以只需重複它:

SELECT accountNumber, accountName, sectorID, territoryID, regionID, 
     SUM(amount) AS totalSales, 
     (CASE WHEN SUM(amount) < 1001.00 THEN 1001.00 - SUM(amount) 
      WHEN SUM(amount) < 2501.00 THEN 2501.00 - SUM(amount) 
      WHEN SUM(amount) < 5001.00 THEN 5001.00 - SUM(amount) 
      WHEN SUM(amount) < 10001.00 THEN 10001.00 - SUM(amount) 
      WHEN SUM(amount) < 15001.00 THEN 15001.00 - SUM(amount) 
     END) AS needed 
FROM tblsales 
GROUP BY accountName 
ORDER BY accountName ASC 

這在SQL的所有方言中都是如此。原因很簡單:SQL沒有指定SELECT語句中表達式的評估順序。因此,可以在定義別名之前評估使用別名的表達式。

+0

好的,我修復了代碼中的SUM(金額),但仍然出現錯誤。嘗試數學方括號,移動()周圍,花費另一半小時通過互聯網。我甚至試着把ELSE放在最後,以便搜索它。客戶「妻子」要我完成,所以我可以花時間與她,幫助,哈哈。 –

+0

@CaliforniaSteve。 。 。什麼樣的錯誤?代碼看起來正確。 –