2

SQL Serverで2013年度の7日間のデータ(2012年10月1日から2013年9月30日まで)を集計しようとしましたが、今のところ運がありません。誰か見てください。以下は私のサンプルデータです。

DATE       BREAD    MILK    
10/1/12    1        3
10/2/12    2        4
10/3/12    2        3
10/4/12    0        4
10/5/12    4        0
10/6/12    2        1
10/7/12    1        3
10/8/12    2        4
10/9/12    2        3
10/10/12   0        4
10/11/12   4        0
10/12/12   2        1
10/13/12   2        1

したがって、私の希望する出力は次のようになります。

DATE       BREAD    MILK
10/1/12    1        3
10/2/12    2        4
10/3/12    2        3
10/4/12    0        4
10/5/12    4        0
10/6/12    2        1
Total      11       15
10/7/12    1        3
10/8/12    2        4
10/9/12    2        3
10/10/12   0        4
10/11/12   4        0
10/12/12   2        1
10/13/12   2        1
Total      13       16

--------through 9/30/2013

2013年度は2012年10月1日に開始し、2012年9月30日に終了するため、2013年度の第1週は7日ではなく6日になります。

SQLServer2008を使用しています。

4

5 に答える 5

2

日付値の新しい計算列を追加して、週ごとにグループ化し、他の列を合計すると、次のようになります。

SELECT DATEPART(ww, DATEADD(d,-2,[DATE])) AS WEEK_NO, 
       SUM(Bread) AS Bread_Total, SUM(Milk) as Milk_Total
FROM YOUR_TABLE
GROUP BY DATEPART(ww, DATEADD(d,-2,[DATE]))

DATEADD:日付に基づいて週の最初の日を月曜日に設定するために、2日を使用して減算しました。必要に応じてこれを変更できます。

于 2013-03-25T16:42:57.130 に答える
2

GROUPBYROLLUP演算子でオプションを使用する

SELECT CASE WHEN DATE IS NULL THEN 'Total' ELSE CONVERT(nvarchar(10), DATE, 101) END AS DATE,
       SUM(BREAD) AS BREAD, SUM(MILK) AS MILK
FROM dbo.test54
GROUP BY ROLLUP(DATE),(DATENAME(week, DATE))

SQLFiddleのデモ

結果:

DATE        BREAD   MILK
10/01/2012  1       3
10/02/2012  2       4
10/03/2012  2       3
10/04/2012  0       4
10/05/2012  4       0
10/06/2012  2       1
Total       11      15
10/07/2012  1       3
10/08/2012  4       7
10/10/2012  0       4
10/11/2012  4       0
10/12/2012  2       1
10/13/2012  2       1
Total       13      16
于 2013-03-25T17:06:32.263 に答える
0

あなたはロールアップを探しています。この場合、ロールアップを実行するためにグループ化する列が少なくとももう1つ必要になります。これを行う最も簡単な方法は、日付ごとにグループ化する計算列を追加することです。

見てみましょう:ROLLUPを使用したデータの要約

于 2013-03-25T16:16:22.720 に答える
0

これがどのように行われるかについての一般的な考え方です:

そのレコードが属する会計週を判別するには、各行に派生列が必要です。一般に、そのレコードの日付を10/1から減算し、経過日数を取得し、7で除算して、結果を最小化することができます。

次に、その派生列をGROUP BYして、SUM集計関数を使用できます。

最大のしわは、あなたが始めた週6日です。週が日曜日または使用する任意の日に開始するようにロジックを追加する必要がある場合がありますが、これで開始できます。

于 2013-03-25T16:17:34.030 に答える
0

上記のWITHROLLUPの提案が役立ちます。データを保存し、必要に応じて変換する必要があります。

あなたができる必要がある最大のことはあなたの週を適切に特定することです。それらをまだテーブルにロードしていない場合は、それらを識別できるように、その場で構築できます。これを行う1つの方法は次のとおりです。

CREATE TABLE #fy (fyear int, fstart datetime, fend datetime);
CREATE TABLE #fylist(fyyear int, fydate DATETIME, fyweek int);

INSERT INTO #fy
SELECT 2012, '2011-10-01', '2012-09-30'
UNION ALL
SELECT 2013, '2012-10-01', '2013-09-30';

INSERT INTO #fylist
        ( fyyear, fydate )

SELECT fyear, DATEADD(DAY, Number, DATEADD(DAY, -1, fy.fstart)) AS fydate
FROM Common.NUMBERS
CROSS APPLY (SELECT * FROM #fy WHERE fyear = 2013) fy
WHERE fy.fend >= DATEADD(DAY, Number, DATEADD(DAY, -1, fy.fstart));

WITH weekcalc AS
(
    SELECT DISTINCT DATEPART(YEAR, fydate) yr, DATEPART(week, fydate) dt
    FROM #fylist

),
    ridcalc AS
(
    SELECT 
    ROW_NUMBER() OVER (ORDER BY yr, dt) AS rid, yr, dt
    FROM weekcalc
)   

UPDATE #fylist
SET fyweek = rid
FROM #fylist
JOIN ridcalc
    ON DATEPART(YEAR, fydate) = yr
    AND DATEPART(week, fydate) = dt;



 SELECT list.fyyear, list.fyweek, p.[date], COUNT(bread) AS Bread, COUNT(Milk) AS Milk
 FROM products p
 JOIN #fylist list 
    ON p.[date] = list.fydate
 GROUP BY list.fyyear, list.fyweek, p.[date] WITH ROLLUP;

上記のCommon.Numbers参照は、私がこの種のものに使用する単純な数値表です(1から1Mになります)。必要に応じて、その場で構築することもできます。

于 2013-03-25T16:44:09.583 に答える