2

クライアントの名前と 2014 年 1 月のすべてのチェック日を 1 行で表示したいと考えています。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

これは、SQL サーバーの 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

OK、ここで使用する必要があるのは、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 に答える