2016-03-03 48 views
0

我有一個數據庫根據標籤確定不同的值。 標籤決定它是否爲豁免值的地方。例如,2 =未被豁免,3 =被豁免。如果我運行一個查詢我的結果是這個樣子在SQL列中添加特定值列由其他列確定

|Name |ExemptionStatus |Total Value| 
    |X  |2    |100  | 
    |X  |3    |200  | 

我的查詢是

SELECT NAME, EXEMPTIONSTATUS 
      SUM(TOTAL_VALUE) AS 'TOTAL VALUE' 
    FROM ORDER_ACCOUNT JOIN ACCOUNT_INVOICE 
    WHERE ORDER_ACCOUNT.DATE BETWEEN 'M/D/YEAR' AND 'M/D/YEAR' 
    GROUP BY NAME, EXEMPTIONSTATUS 
    ORDER BY NAME ASC 

我怎樣才能得到我的查詢以創建值的新列,例如:

|Name |NON EXEMPT VALUE|EXEMPT VALUE| 
    |X  |100    |200   | 

我只是不知道如何排序它是否在我的Where子句中。

+0

爲什麼不使用Pivot? –

回答

0

在一個SUM中使用CASE語句,只有總數爲NON EXEMPT,然後是EXEMPT,然後選擇它們作爲單獨的列。類似以下內容(可能需要TOTAL_VALUE添加到GROUP BY或刪除EXEMPTIONSTATUS)

SELECT 
NAME 
,SUM(CASE WHEN EXEMPTIONSTATUS = 2 THEN TOTAL_VALUE ELSE 0 END) AS 'NON EXEMPT VALUE' 
,SUM(CASE WHEN EXEMPTIONSTATUS = 3 THEN TOTAL_VALUE ELSE 0 END) AS 'EXEMPT VALUE' 
FROM ORDER_ACCOUNT JOIN ACCOUNT_INVOICE 
WHERE ORDER_ACCOUNT.DATE BETWEEN 'M/D/YEAR' AND 'M/D/YEAR' 
GROUP BY NAME, EXEMPTIONSTATUS 
ORDER BY NAME ASC 

編輯:下面新代碼添加新的列到現有的表。你需要用你的牌桌代替#Test,但我相信這會讓你找到你想要的。

SELECT 
NAME, 
EXEMPTIONSTATUS 
,[TOTAL_VALUE] 
,(SELECT SUM(CASE WHEN EXEMPTIONSTATUS = 2 THEN TOTAL_VALUE ELSE 0 END) FROM #Test t WHERE t.NAME = NAME) 'NON EXEMPT VALUE' 
,(SELECT SUM(CASE WHEN EXEMPTIONSTATUS = 3 THEN TOTAL_VALUE ELSE 0 END) FROM #Test t WHERE t.NAME = NAME) 'EXEMPT VALUE' 
FROM #Test 

這給了我下面的輸出

| NAME | EXEMPTIONSTATUS | TOTAL_VALUE | NON EXEMPT VALUE | EXEMPT VALUE | 
| X | 2    | 100   | 100    | 200   | 
| X | 3    | 200   | 100    | 200   | 
+0

謝謝你,工作。它雖然把零代替在列中應該在那裏的值,所以我只需要看看是不是像在哪裏不要像VALUE LIKE'0'之類的東西。但至少這讓我走上了正軌。 – walangala

+0

嗯,那不應該用0代替任何東西......你是什麼意思? –

+0

我道歉我在這方面有點新,我沒有注意到它的正確。在CASE中狀態爲「ELSE 0」的地方,顯示0值。我只想弄清楚如何將新列對齊在一起。 – walangala

0

比方說,你的表結構是這樣的:

CREATE TABLE tab(ID int, Name nvarchar(20), ExemptionStatus int, TotalValue int); 
INSERT INTO tab(ID, Name, ExemptionStatus, TotalValue) values (1, 'X', 2, 100); 
INSERT INTO tab(ID, Name, ExemptionStatus, TotalValue) values (2, 'X', 3, 200); 

所以你的數據看起來是這樣的:

ID Name ExemptionStatus TotalValue 
    1  X  2    100 
    2  X  3    200 

然後你使用的查詢是:

SELECT  NotExempted.Name, 
      NotExempted.NonExemptValue, 
      Exempted.ExemptValue 
FROM  (SELECT  Name, 
         CASE 
          WHEN ExemptionStatus = 2 THEN TotalValue 
         END 
         AS 'NonExemptValue' 
      FROM  #tab 
      ) NotExempted 
INNER JOIN (SELECT  Name, 
         CASE 
          WHEN ExemptionStatus = 3 THEN TotalValue 
         END 
         AS 'ExemptValue' 
      FROM  #tab 
      ) Exempted ON NotExempted.Name = Exempted.Name 
WHERE  NotExempted.NonExemptValue IS NOT NULL 
AND   Exempted.ExemptValue IS NOT NULL 
GROUP BY  NotExempted.Name, 
      NotExempted.NonExemptValue, 
      Exempted.ExemptValue 

你結果將是這樣的:

Name NonExemptValue ExemptValue 
X   100    200 

這裏你可以看到這一點 - >http://sqlfiddle.com/#!9/8902d3/2

現在,讓我們假設你有數據是這樣的:

CREATE TABLE #tab(ID int, Name nvarchar(20), ExemptionStatus int, TotalValue int) 
INSERT INTO #tab(ID, Name, ExemptionStatus, TotalValue) values (1, 'X', 2, 100) 
INSERT INTO #tab(ID, Name, ExemptionStatus, TotalValue) values (2, 'X', 3, 200) 
INSERT INTO #tab(ID, Name, ExemptionStatus, TotalValue) values (3, 'X', 2, 1000) 
INSERT INTO #tab(ID, Name, ExemptionStatus, TotalValue) values (4, 'X', 3, 2000) 
INSERT INTO #tab(ID, Name, ExemptionStatus, TotalValue) values (5, 'X', 2, 1045) 
INSERT INTO #tab(ID, Name, ExemptionStatus, TotalValue) values (6, 'X', 3, 2045) 
INSERT INTO #tab(ID, Name, ExemptionStatus, TotalValue) values (7, 'X', 2, 1034) 
INSERT INTO #tab(ID, Name, ExemptionStatus, TotalValue) values (8, 'X', 3, 2023) 
INSERT INTO #tab(ID, Name, ExemptionStatus, TotalValue) values (9, 'X', 2, 1023) 
INSERT INTO #tab(ID, Name, ExemptionStatus, TotalValue) values (10, 'X', 3, 2076) 

看起來像這樣:

ID Name ExemptionStatus TotalValue 
    1  X   2    100 
    2  X   3    200 
    3  X   2    1000 
    4  X   3    2000 
    5  X   2    1045 
    6  X   3    2045 
    7  X   2    1034 
    8  X   3    2023 
    9  X   2    1023 
    10  X   3    2076 

如果您需要總結的總價值高達,那麼你可以使用下面的查詢(這是上面的查詢略有修改):

SELECT  NotExempted.Name, 
      NotExempted.NonExemptValue, 
      Exempted.ExemptValue 
FROM  (SELECT  Name, 
         CASE 
          WHEN ExemptionStatus = 2 THEN (SELECT SUM(TotalValue) FROM #tab WHERE ExemptionStatus = 2) 
         END 
         AS 'NonExemptValue' 
      FROM  #tab 
      ) NotExempted 
INNER JOIN (SELECT  Name, 
         CASE 
          WHEN ExemptionStatus = 3 THEN (SELECT SUM(TotalValue) FROM #tab WHERE ExemptionStatus = 3) 
         END 
         AS 'ExemptValue' 
      FROM  #tab 
      ) Exempted ON NotExempted.Name = Exempted.Name 
WHERE  NotExempted.NonExemptValue IS NOT NULL 
AND   Exempted.ExemptValue IS NOT NULL 
GROUP BY  NotExempted.Name, 
      NotExempted.NonExemptValue, 
      Exempted.ExemptValue 

你的結果會是這樣的:

Name NonExemptValue ExemptValue 
X   4202    8344 

這裏你可以看到這一點 - >http://sqlfiddle.com/#!9/02c76/3

希望這有助於!

+0

我得到它的工作,但現在我想學習的是如何添加兩個從案例創建的列。我會試圖弄明白,如果不是,我會把它作爲一個新的問題發佈,因爲這是適當的禮儀。 – walangala

+0

其實我得到了我需要的東西,其他兩個值的總和最初是在我不選擇案例時完成的,我明白了。 – walangala

+0

@ d_li1121我添加了一個小提琴來更清楚地顯示結果集。 **您可以看到只返回一行** –