2013-10-23 140 views
2

我期待在1行上顯示我的客戶名稱和2014年1月份的所有支票日期。某些客戶可能有5個支票日期,而其他客戶可能只有1或3個。有沒有如何做到這一點?使用此SQL查詢:有沒有辦法在1行顯示這個SQL查詢?

SELECT CC.co, checkDate FROM CCalendar CC 
    INNER JOIN CInfo CI on CC.co = CI.co 
WHERE checkDate BETWEEN '01/01/2014' AND '01/31/2014' 
    AND CI.endDate IS NULL AND CI.status IN ('LIVE', 'CONVERSION') 

結果目前是這樣的:

co | checkDate 
---+------------ 
co | 01/03/2014 
co | 01/14/2014 
co | 01/17/2014 
co | 01/24/2014 
co | 01/24/2014 

,我希望它看起來像這是什麼

Co | checkdate1| checkdate2| checkdate3| checkdate4| checkdate5| 
co | 01/03/2014| 01/14/2014| 01/17/2014| 01/24/2014| 01/24/2014| 
+0

哪些檢查日期是否要顯示,如果有*是*多個值嗎?系統不會*猜* –

+0

我想在本月內顯示所有檢查日期。有些客戶(很少)會在mngmt與其他員工分開付款的情況下在同一日期進行檢查。 – BSanders

+0

你能編輯你的問題並顯示你的預期結果嗎?你的解釋沒有幫助我 –

回答

0

OK,你需要在這裏使用既PIVOTROW_NUMBER的組合。

你statment應該接近這個:

SELECT co, [1] as checkDate1, [2] checkDate2, [3] checkDate3, [4] checkDate4, [5] checkDate5 FROM 
(
SELECT CC.co, 
ROW_NUMBER() OVER (PARTITION BY CC.co ORDER BY CC.co) AS CheckDateNum, checkDate 
FROM CCalendar CC 
    INNER JOIN CInfo CI on CC.co = CI.co 
WHERE checkDate BETWEEN '01/01/2014' AND '01/31/2014' 
    AND CI.endDate IS NULL AND CI.status IN ('LIVE', 'CONVERSION') 
) AS T1 

PIVOT (MAX(checkDate) for CheckDateNum in ([1],[2],[3],[4],[5])) as checkDate 

例子:

enter image description here

+0

這給了我一個SET COMPATIBILITY_LEVEL錯誤... – BSanders

+0

請檢查此[解決方案](http://stackoverflow.com/questions/5624262/understanding-compatibility-level-in-sql-server)的錯誤。我已經在SQL Server 2008 R2上測試過了。您可能需要像這樣更改兼容性級別: 'ALTER DATABASE database_name SET COMPATIBILITY_LEVEL = 100' – Rachid

+0

我得到了這個工作!謝謝!我試圖將日期時間的格式更改爲標準的美國日期IE 10/29/2013,我不斷收到錯誤。任何線索我會放在那裏? – BSanders

2

你是你在做什麼尋找功能類似於MySql的group_concat函數,只能在SQL Server中代替。

這可能是一個糟糕的主意在你的查詢中這麼做......相反,你應該在你的用戶界面/前端處理這個問題,並建立逗號分隔的checkDate列。

但是,如果你仍然想這樣做在您的查詢,this question's answers show how this can be done in SQL Server.

0

這將使用SQL Server的XML功能,使

SELECT CC.co, 
    stuff((
    SELECT ',' + CAST(checkDate AS varchar(MAX)) 
    FROM CInfo CI 
    WHERE CI.co = CC.co 
    AND checkDate BETWEEN '01/01/2014' AND '01/31/2014' 
    AND CI.endDate IS NULL AND CI.status IN ('LIVE', 'CONVERSION') 
    for xml path('') 
),1,1,'') as CheckDateList 
0

嘗試使用逗號分隔的日期列表CASE .. WHEN .. THEN .. ELSE .. END'語法在SQL

SELECT CC.co, 

(case when ROW_NUMBER() OVER (ORDER BY CC.co) = 1 then checkDate end) as [checkDate1], 

(case when ROW_NUMBER() OVER (ORDER BY CC.co) = 2 then checkDate end) as [checkDate2], 

(case when ROW_NUMBER() OVER (ORDER BY CC.co) = 3 then checkDate end) as [checkDate3], 

(case when ROW_NUMBER() OVER (ORDER BY CC.co) = 4 then checkDate end) as [checkDate4], 

(case when ROW_NUMBER() OVER (ORDER BY CC.co) = 5 then checkDate end) as [checkDate5] 

FROM CCalendar CC 
    INNER JOIN CInfo CI on CC.co = CI.co 
WHERE checkDate BETWEEN '01/01/2014' AND '01/31/2014' 
    AND CI.endDate IS NULL AND CI.status IN ('LIVE', 'CONVERSION') 
+0

這看起來像是我需要但我得到這個錯誤:無效的列名'RowNum'。 – BSanders

+0

如何用ROW_NUMBER()OVER(ORDER BY CC.co)替換RowNum。查看更新的SQL – Rachid

+0

我得到這個錯誤窗口函數不能用在另一個窗口函數或聚合的上下文中。不知道爲什麼。 – BSanders

相關問題