2

我希望在 1 行显示我的客户姓名和他们在 2014 年 1 月的所有检查日期。一些客户可能在一个月内有 5 个检查日期,而另一些可能只有 1 或 3 个。有没有办法让这发生?使用此 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|
4

4 回答 4

2

你要找的是一个类似于MySql 的group_concat函数,只是在SQL Server 中代替。

在您的查询中执行此操作可能是一个坏主意……相反,您应该在您的 UI / 前端处理它,并在checkDate那里建立您的逗号分隔列。

但是,如果您仍想在查询中执行此操作,此问题的答案显示了如何在 SQL Server 中完成此操作。

于 2013-10-23T18:03:38.173 回答
0

好的,您需要在这里使用PIVOTROW_NUMBER的组合。

你的陈述应该接近这个:

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

例子:

在此处输入图像描述

于 2013-10-23T20:56:30.370 回答
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
于 2013-10-23T18:04:55.427 回答
0

尝试在SQL中使用 CASE .. WHEN .. THEN .. ELSE .. END' 语法。

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') 
于 2013-10-23T18:16:07.830 回答