2017-08-15 50 views
0

我有一個正在我的應用程序中使用的查詢。我不得不做一個小的編輯(選擇一個額外的列),現在我這樣做,我得不到相同的結果,因此我得到一個不好的文件。爲了給例如,這是查詢的樣子....是否可以從數據庫中選擇列而不將其顯示在結果集中 - 如果選中,則會導致分組出現問題

Select 
    'X' = tblA.VendorNumber, 
    'Y' = tblB.Label, 
    'Z' = tblC.InvoiceNo, 
    'W' = tblD.Checks, 
From //Doing some joins here 
Group By 
    tblA.VendorNumber, tblB.label, tblc.InvoiceNo, tblD.Checks 

結果集給了我很多的記錄,但以相同的X的那些羣體,Y,Z,W - 所以有沒有GROUP BY它看起來像這樣

X    Y     Z     W 
----------------------------------------------------------- 
123    Anton    772    0 
123    Anton    772    0 

顯然,與組由它們被彙總到一個...

問題是當我嘗試包括在我的Select查詢的附加列。我需要這個查詢,因爲我需要重視我的代碼,以便能夠區分它是什麼類型的記錄。在新列中,這兩行數據並不相同,因此它們不會彙總。

有沒有辦法讓我以某種方式添加額外的列,但不顯示它,並從Group By中排除它?

這就是我的意思

Select 
    'X' = tblA.VendorNumber, 
    'Y' = tblB.Label, 
    'Z' = tblC.InvoiceNo, 
    'W' = tblD.Checks, 
    'P' = tblC.Proc  -- New column 
From //Doing some joins here 
Group By 
    tblA.VendorNumber, tblB.label, tblc.InvoiceNo, tblD.Checks, 
    tblC.Proc  -- New column 

在這種情況下,數據看起來像這樣

X    Y     Z     W   P 
--------------------------------------------------------------------- 
123    Anton    772    0   FPN 
123    Anton    772    0   PPN 

所以,現在,P是對2條記錄,以前都彙總到一個不同的,是有一種方法讓我以某種方式不顯示P,但是,仍然能夠從我的記錄集中獲得它的價值。如果在這個查詢中沒有選擇'P',並且由於這兩個記錄沒有捲起來,我無法選擇'P',我遇到了一些重大問題。

基本上我需要選擇'P'但不包括它在我的結果集或分組中。

任何幫助將不勝感激。

+2

如果值是每一行的不同,你仍然希望他們捲起成一排,是怎樣的處理器應該決定將哪兩個不同的值包含在捲起的行中?不,你不能在一個結果集中做到這一點。您需要爲另一個未彙總的結果集執行單獨的查詢。或者,如果您只希望捲起「P」個記錄,只需添加一個Where子句,它只會彙總「P」行。 –

+0

爲什麼GROUP BY在不使用聚合函數時?你是否想要做一個SELECT DISTINCT? – jarlh

+0

什麼是「我需要選擇'P'但不包括它在我的結果集中」甚至意味着什麼?你認爲選擇某些東西並將其包含在結果集中有什麼區別?從樣本數據中添加您想要的結果可能會有所幫助。如果你想「從你的記錄集中獲得它的價值」,你希望這是什麼價值? –

回答

3

有幾個選項,我猜...你不是一個真正的方式來獲得值,而不會在搜索結果中有他們。你還會怎麼讀?

一個將「P」的STUFF值到逗號分隔的列表,即:

X    Y     Z     W   P 
123    Anton    772    0   FPN,PPN 

然後在你的用逗號分隔的應用程序閱讀。在這裏閱讀:https://stackoverflow.com/questions/31211506/how-stuff-and-for-xml-path-work-in-sql-server

如果沒有太多的'P'選項或者您知道所有選項,另一種方法是創建布爾標題。

,SUM(CASE WHEN tlbc.Proc = 'PPN' THEN 1 ELSE 0 END) AS "PPN" 

編輯:正確左明聚集在其周圍,因此集團可以使用CASE之類的語句創建。可以使用MAX,1或0,取決於tlbc.Proc可以得到多少結果。你的案例中的一些聚合函數將把你的行合併爲一個。

對於這樣的結果:

X    Y     Z     W   FPN   PPN   AnotherP 
123    Anton    772    0   1   1   0 

第三,如果我誤解你的問題,你並不需要的值,但只需要他們在WHERE,然後不顯示出來。

肯定有更多的方法可以解決這個問題。

這有幫助嗎?

+0

謝謝你的建議 – BobSki

+0

@BobSki沒問題!讓我知道,如果其中任何一個不適合您的具體情況,我們可以嘗試去思考其他事情。 – justiceorjustus

2

你需要在P上做某種聚合函數,所以你不需要對它進行分組。如果你只關心其中一個值,你可以使用MIN()或MAX()來獲得其中的一個值。

所以,像這樣:

SELECT X, Y, Z, MAX(P) AS P etc.... 

另一種方法是使用類似FOR XML路徑值轉動到一個單一值(也許用英文逗號分隔)。網上有很多這樣的例子。這裏有一個例子:

https://sqlperformance.com/2014/08/t-sql-queries/sql-server-grouped-concatenation

+0

謝謝你的建議 – BobSki

0

如果您只希望每個第一個DISTINCT四列中有一條記錄,您希望顯示哪一列P列?

如果您對這個問題的答案,只是添加到查詢

Where tblC.Proc = -->YOUR_EXPECTED_VALUE_OR_CONDITION_HERE<-- 
相關問題