2010-03-18 70 views
1

不確定這是否可以單獨使用sql可行,但這是問題所在。我有一個奇怪的要求,即數據需要以列顯示,以便用戶可以快速比較數據!顯示多列中的行

下面是結果集是什麼樣子,現在

CustomerID Company  Active 
001   ATT  Y 
002   ATT  N 
003   ATT  Y 
001   VZ   Y 
002   VZ   N 
003   VZ   Y 
001   TM   Y 
002   TM   Y 
003   TM   Y 

現在,這是他們希望看到它

CustomerID Company  Active  Company  Active  Company  Active 
001  ATT   Y   VZ   Y   TM   Y 
002  ATT   N   VZ   N   TM   Y 
003  ATT   Y   VZ   Y   TM   Y 

假設:

  • 這可能是一個相當長表, 這就是爲什麼他們希望看到所有 公司在一行,而不是 需要向下滾動以查看 是否處於活動狀態。公司 的
    • Nummber是任何幫助表示讚賞1-3在大多數情況下
    • 之間

謝謝!

+1

你如何向他們展示結果?它是在一個網站(即表格)還是直接訪問SQL Server? – Codesleuth 2010-03-18 13:10:54

+0

每個客戶都是3個公司嗎?例如它是#001和#002的ATT,VZ,TM嗎?還是由客戶改變?例如ATT,VZ爲#001和ATT,SP爲#002? – PowerUser 2010-03-18 13:20:50

+2

這似乎是一個演示文稿問題,可能是數據庫之外最好的處理方式。 – 2010-03-18 13:22:40

回答

-1

最好的辦法就是看看通過動態SQL做到這一點。

+0

Downvoter:謹慎解釋爲什麼? – code4life 2012-05-09 14:15:02

3

查詢的版本可能是這樣的:

SELECT 
    CustList.CustomerId 
    ,t1.Company 
    ,t1.Active 
    ,t2.Company 
    ,t2.Active 
    ,t3.Company 
    ,t3.Active 
from (select distinct CustomerId from MyTable) CustList 
    left outer join MyTable t1 -- outer join, in case a customer might not "have" a given company 
    on t1.CustomerId = CustList.CustomerId 
    left outer join MyTable t2 
    on t2.CustomerId = CustList.CustomerId 
    left outer join MyTable t3 
    on t3.CustomerId = CustList.CustomerId 
where t1.Company = 'Att' 
    and t2.Company = 'VZ' 
    and t3.Company = 'TM' 

但是,除非你事先知道哪些公司名稱是和有多少,你必須 建立查詢和運行動態的,每次由:

  • 首先找出將通過該名單包括
  • 環公司的名單,並在語句添加(列,加入,其中/和),每家公司(T1,T2等等)
  • 動態執行查詢

模糊,但可行的。

- 編輯---------------------------------

堅果。外連接仍然有問題。 (我想如果我把它寫在真正的表格上,我會把它寫出來......)

我相信查詢是「連接」太多的行,每個外部連接後的第一個。試試這個:

SELECT 
    CustList.CustomerId 
    ,t1.Company 
    ,t1.Active 
    ,t2.Company 
    ,t2.Active 
    ,t3.Company 
    ,t3.Active 
from (select distinct CustomerId from MyTable) CustList 
    left outer join MyTable t1 -- outer join, in case a customer might not "have" a given company 
    on t1.CustomerId = CustList.CustomerId 
    and t1.Company = 'ATT' 
    left outer join MyTable t2 
    on t2.CustomerId = CustList.CustomerId 
    and t2.Company = 'VZ' 
    left outer join MyTable t3 
    on t3.CustomerId = CustList.CustomerId 
    and t3.Company = 'TM' 

測試或這方面的工作了時的錯誤,嘗試運行它爲一家公司,然後添加公司一個接一個,看看會發生什麼。

+0

菲利普,感謝您的解決方案,它似乎工作,但我得到了比我應該更多的記錄。我懷疑它是聯接語句,但即使將其更改爲內部聯接仍會返回相同數量的記錄。我在代碼中看到您的評論,並給出所有客戶都必須擁有相同公司數量 – hsalama 2010-03-18 16:01:28

+0

我在「編輯」下添加了一個修訂後的查詢。 – 2010-03-18 20:26:46

0

如果公司的名單總是有限的精確值的同一集合,你在評論暗示是真實的,你可以使用the PIVOT feature(SQL Server 2005和以上):

SELECT CustomerID, [ATT], [VZ], [TM] 
FROM (/* whatever gave you that result set above */) AS NormalizedData 
PIVOT (MAX(Active) FOR Company IN ([ATT],[VZ],[TM])) AS PivotedData 

MAX()是因爲您必須使用PIVOT的集合函數;如果公司只有一個價值,那不應該是一個問題。

這不會給出與您要求的完全相同的結果集。如果指定的輸出列清單的要求,選擇條款改爲:

SELECT 
    CustomerID, 
    -- Use CASE so output is NULL if Active column is NULL 
    -- If you don't care, use: 'ATT' AS Company 
    CASE WHEN [ATT] IS NOT NULL THEN 'ATT' END AS Company, 
    [ATT] AS Active, 
    CASE WHEN [VZ] IS NOT NULL THEN 'VZ' END AS Company, 
    [VZ] AS Active, 
    CASE WHEN [TM] IS NOT NULL THEN 'TM' END AS Company, 
    [TM] AS Active 

但是,我認爲他們會喜歡的冷凝輸出更好,因爲它可以更容易給所有的值進行比較。

如果沒有特定公司的行,它將在該列中返回一個NULL。可悲的是,我不知道如何使動態sql的列列表動態化(從SQL Server 2005開始 - 沒有看過2008)。所以,如果另一家公司被添加(比如'SPR'),你將不得不返回並更改查詢。

你可能要做些什麼來幫助他們比較的另一件事是通過增加直接重複檢查:

WHERE CustomerID IN 
    (SELECT CustomerID FROM (/* original query */) Data 
    GROUP BY CustomerID, Active HAVING COUNT(*) > 1) 

這將輸出列表限制爲僅與多個Active標誌的項目。這可以添加到您的原始查詢或被旋轉的查詢中,但通過旋轉的查詢可以直接與輸出列進行比較,並避免額外的子查詢。當您可以讓計算機爲您完成時,手動掃描一系列值並無意義。