2013-10-23 82 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

相关问题