3

この問題はこれに関連しており、解決策はありません:ここ

エリアのすべてのセッションを示すテーブルがあります。

このセッションには開始日があります。

特定のエリア(この場合)ごとに、セッションの開始日のすべての日を取得する必要があります

私はこのクエリを持っています:

SELECT idArea, idSession, startDate FROM SessionsPerArea WHERE idArea = 1

idArea | idSession |  startDate  |
   1   |    1      |  01-01-2013 |
   1   |    2      |  04-01-2013 |
   1   |    3      |  07-02-2013 |

そして、私はこのようなものが欲しいです:

    date     |  Session    |
01-01-2013   |    1        |
02-01-2013   |    NULL     |
03-01-2013   |    NULL     |
04-01-2013   |    1        |
........     |             |
29-01-2013   |   NULL      |
30-01-2013   |   NULL      |

この場合、テーブルは1月中ずっと私を返します。

2番目の列は、同じ日に複数のセッションが存在する可能性があるため、その日に発生するセッションの数です。

誰でも私を助けることができますか?

4

3 に答える 3

4

してみてください:

DECLARE @SessionsPerArea TABLE (idArea INT, idSession INT, startDate DATEtime)
INSERT  @SessionsPerArea VALUES (1,1,'2013-01-01')
INSERT  @SessionsPerArea VALUES (1,2,'2013-01-04')
INSERT  @SessionsPerArea VALUES (1,3,'2013-07-02')

DECLARE @RepMonth as datetime
SET @RepMonth = '01/01/2013';
WITH DayList (DayDate) AS
(
    SELECT @RepMonth
    UNION ALL
    SELECT DATEADD(d, 1, DayDate)
    FROM DayList
    WHERE (DayDate < DATEADD(d, -1, DATEADD(m, 1, @RepMonth)))
)
SELECT *
FROM DayList t1 left join @SessionsPerArea t2 on t1.DayDate=startDate and t2.idArea = 1
于 2013-03-22T12:46:22.860 に答える
3

これは機能します:

DECLARE @SessionsPerArea TABLE (idArea INT, idSession INT, startDate DATE)
INSERT  @SessionsPerArea VALUES
(1,1,'2013-01-01'),
(1,2,'2013-01-04'),
(1,3,'2013-07-02')

;WITH t1 AS 
(
    SELECT  startDate
            , DATEADD(MONTH, DATEDIFF(MONTH, '1900-01-01', startDate), '1900-01-01') firstInMonth
            , DATEADD(DAY, -1, DATEADD(MONTH, DATEDIFF(MONTH, '1900-01-01', startDate) + 1, '1900-01-01')) lastInMonth
            , COUNT(*) cnt
    FROM    @SessionsPerArea
    WHERE   idArea = 1
    GROUP BY
            startDate
)
, calendar AS
(
    SELECT  DISTINCT DATEADD(DAY, c.number, t1.firstInMonth) d
    FROM    t1 
    JOIN    master..spt_values c ON
            type = 'P'
    AND     DATEADD(DAY, c.number, t1.firstInMonth) BETWEEN t1.firstInMonth AND t1.lastInMonth
)

SELECT  d date
        , cnt Session
FROM    calendar c
LEFT    JOIN t1 ON t1.startDate = c.d

テーブルでの単純な結合を使用してmaster..spt_values行を生成します。

于 2013-03-22T12:51:36.537 に答える
1

カレンダーテーブルのほんの一例です。1か月のデータを返すには、1年間の日数を32未満から365+1に調整します。1か月の日数、または開始日と終了日の間の日数をクエリで計算できます。SQLServerでこれを行う方法がわかりません。2013年1月のすべての日付を表示するために、ハードコードされた値を使用しています。差分の開始日と終了日を調整できます。月またはクエリで開始日/終了日を取得するには...:

WITH data(r, start_date) AS 
(
 SELECT 1 r, date '2012-12-31' start_date FROM any_table --dual in Oracle
  UNION ALL
 SELECT r+1, date '2013-01-01'+r-1 FROM data WHERE r < 32 -- number of days between start and end date+1
)
 SELECT start_date FROM data WHERE r > 1
/

START_DATE
----------
1/1/2013
1/2/2013
1/3/2013
...
...
1/31/2013
于 2013-03-22T13:30:46.627 に答える