2010-09-16 87 views
2

我有一個大的雜亂的報告來編寫跨5個表的連接。一張表中有一列用於多個不同的值 - 本質上是一個「標籤」列,其中標籤以創造性的方式使用,取決於用戶想要使用什麼樣的其他元數據。在SQL Server SELECT語句中使用CASE時消除NULL NULL

結果,我對報告查詢返回3不同之處僅在「標籤」一欄幾乎相同的行;舉例來說,我可能會得到:

NAME TAG EMAIL 
BOB A [email protected] 
BOB B [email protected] 
BOB C [email protected] 

我想要做的是分裂TAG列的內容要返回從查詢3個獨立的欄目,像這樣的內容:

NAME A B C EMAIL 
BOB A B C [email protected] 

所以我嘗試使用SQL SERVER CASE/WHEN功能來執行此操作;我在說,例如,當標籤列的值是「A」時,將它返回到列「A」;如果是「B」,則放入「B」;等等。我認爲這將返回上面的,而是它給了我這樣的:

NAME A B C EMAIL 
BOB A NULL NULL [email protected] 
BOB NULL B NULL [email protected] 
BOB NULL NULL C [email protected] 

其中明確不太理想。

任何想法,堆棧溢出的天才?

回答

5

試試這個:

Select Name, 
    Min (Case When tag = 'A' Then Tag End) A, 
    Min (Case When tag = 'B' Then Tag End) B, 
    Min (Case When tag = 'C' Then Tag End) C, 
    email 
    From tableName 
    Group By Name, email 

編輯:解釋...
每當你使用一個Group By,您告訴查詢處理器您希望它將結果聚合到「桶」中,其中每個桶由列[或表達式]中的唯一值定義def在Group By子句中定義。這意味着最終結果集對於Group By中定義的那些列[或表達式]中的每個唯一值集合將只有一行。在查詢中使用的所有其它列或表達式,(除那些在分組方式定義的其他),必須是基於聚合函數的表達式(如COUNT(),SUM(),AVG(),MIN( ),Max()等),根據計算結果生成一個值,該計算將應用於預彙總結果集中的所有行。如果,例如,我是來Group By姓氏的第一個字符:

Select Left(LastName, 1), Count(*), 
    Sum(Salaray, Avg(Height), 
    Min(DateOfBirth), etc. 
    From Table 
    Group By Left(LastName, 1) 

然後我會在輸出(一個字母表中的每個字母)最多26行和所有其他列我輸出必須根據被應用到原來設定的所有行的一些聚合功能,其中姓與「A」,那麼所有在那裏的姓氏與QA開始行‘B’等。

開始

在你的問題中,Group By只用於限制每個不同用戶和電子郵件的輸出設置爲一行,一旦完成,只會有一行。Select語句中的其他列需要有一個Min(), [Max()將工作一樣),只是爲了滿足粗斜體以上提到的syntacical要求..在你的情況下,將只有一個非null行的集合,所以採取Min(),或Max()是必要的,因爲語法要求...

+0

我想我得到爲什麼這有助於,但你能解釋一下嗎?我爲我明顯的無知道歉。 – SuperNES 2010-09-17 13:22:10

+0

編輯答案添加說明.. – 2010-09-17 15:53:48

6

您需要pivot數據。

;with Report (name, tag, email) as 
(
select 'BOB', 'A', '[email protected]' union 
select 'BOB', 'B', '[email protected]' union 
select 'BOB', 'C', '[email protected]' 
) 
select * from Report 
pivot 
(min(tag) for tag in ([A], [B], [C])) 
as pvt 

並運行上述查詢的結果是這樣的:

NAME EMAIL   A B C 
----------------------------- 
BOB  [email protected] A B C