在Sql中组合两行数据

时间:2014-08-19 13:35:23

标签: sql sql-server datestamp

所以我的数据看起来像这样:

+-----------+---------+-------------+-------+-------------+--+
|   time    | Outlets | Meal_Period | cover | day_of_week |  |
+-----------+---------+-------------+-------+-------------+--+
| 10/1/2013 |      72 |           1 |     0 | Tuesday     |  |
| 10/1/2013 |      72 |           2 |    31 | Tuesday     |  |
| 10/1/2013 |      72 |           3 |   116 | Tuesday     |  |
| 10/1/2013 |      72 |           6 |    32 | Tuesday     |  |
| 10/1/2013 |     187 |          17 |   121 | Tuesday     |  |
| 10/1/2013 |     187 |          18 |   214 | Tuesday     |  |
| 10/1/2013 |     187 |          19 |   204 | Tuesday     |  |
| 10/1/2013 |     101 |           2 |     0 | Tuesday     |  |
| 10/1/2013 |     101 |           3 |     0 | Tuesday     |  |
| 10/1/2013 |     101 |           4 |     0 | Tuesday     |  |
| 10/1/2013 |     101 |           6 |     0 | Tuesday     |  |
| 10/1/2013 |     282 |           1 |    17 | Tuesday     |  |
| 10/1/2013 |     282 |           2 |   207 | Tuesday     |  |
| 10/1/2013 |     282 |           3 |   340 | Tuesday     |  |
| 10/1/2013 |     282 |           6 |     4 | Tuesday     |  |
| 10/1/2013 |     103 |           1 |     0 | Tuesday     |  |
+-----------+---------+-------------+-------+-------------+--+

代码是:

IF OBJECT_ID('tempdb.dbo.#time') IS NOT NULL
    DROP TABLE #time

SELECT DATEADD(dd, 0, DATEDIFF(DD, 0, open_dttime)) AS 'time'
    ,profit_center_id AS 'Outlets'
    ,meal_period_id AS 'Meal_Period'
    ,sum(num_covers) AS 'Number_Covers'
INTO #time
FROM [STOF_Infogen].[dbo].[Order_Header]
WHERE CasinoID = 'csg'
    AND profit_center_id IN (
        '102'
        ,'100'
        ,'283'
        ,'101'
        ,'282'
        ,'187'
        ,'280'
        ,'103'
        ,'281'
        ,'72'
        ,'183'
        )
    AND (
        open_dttime BETWEEN '2014-02-01 06:30'
            AND '2014-03-01 06:30'
        )
GROUP BY profit_center_id
    ,open_dttime
    ,meal_period_id
ORDER BY profit_center_id
    ,meal_period_id

IF OBJECT_ID('tempdb.dbo.#time2') IS NOT NULL
    DROP TABLE #time2

SELECT [TIME]
    ,Outlets AS 'Outlets'
    ,meal_period AS 'Meal_Period'
    ,SUM(number_covers) AS 'cover'
    ,DATENAME(DW, [time]) AS 'day_of_week'
INTO #time2
FROM #time
GROUP BY [TIME]
    ,Outlets
    ,Meal_Period
ORDER BY [TIME] ASC
    ,Outlets
    ,Meal_Period

SELECT *
FROM #time2

我为我的约会创建了临时删除表,但我有两个问题;

  1. 我想将利润中心分为187和282,同时仍保留其他行。
  2. 由于某种原因,我无法调整日期戳,因为它排除了该月的最后一天。
  3. 一如往常,任何帮助都会受到赞赏。

1 个答案:

答案 0 :(得分:1)

制作一些测试数据:

DECLARE @MealInfo TABLE
(
    MealTime DATETIME,
    Outlets VARCHAR(10),
    Meal_Period int,
    Cover INT
)

INSERT INTO @MealInfo
VALUES
('10/1/2013', '72', 1, 0),
('10/1/2013', '72', 2, 31),
('10/1/2013', '72', 3, 116),
('10/1/2013', '72', 6, 32),
('10/1/2013', '187', 17, 121),
('10/1/2013', '187', 18, 214),
('10/1/2013', '187', 19, 204),
('10/1/2013', '101', 2, 0),
('10/1/2013', '101', 3, 0),
('10/1/2013', '101', 4, 0),
('10/1/2013', '101', 6, 0),
('10/1/2013', '282', 1, 17),
('10/1/2013', '282', 2, 207),
('10/1/2013', '282', 3, 340),
('10/1/2013', '282', 6, 4),
('10/1/2013', '103', 1, 0);

因为你想将187和282组合在一起,我会使用一个案例陈述将它们分成一个插座,然后我们可以在出口处分组以分清总和:

SELECT 
    m.MealTime, 
    m.Outlets, 
    m.Meal_Period, 
    SUM(m.Cover) AS Number_Covers
FROM
(
    SELECT mi.MealTime,
        (CASE WHEN mi.Outlets IN ('187', '282') THEN '187+282' ELSE mi.Outlets END) Outlets,
        mi.Meal_Period,
        mi.Cover
    FROM @MealInfo mi
) m
GROUP BY m.MealTime, m.Outlets, m.Meal_Period

这是输出:

MealTime    Outlets Meal_Period Number_Covers
2013-10-01 00:00:00.000 101 2   0
2013-10-01 00:00:00.000 101 3   0
2013-10-01 00:00:00.000 101 4   0
2013-10-01 00:00:00.000 101 6   0
2013-10-01 00:00:00.000 103 1   0
2013-10-01 00:00:00.000 187+282 1   17
2013-10-01 00:00:00.000 187+282 2   207
2013-10-01 00:00:00.000 187+282 3   340
2013-10-01 00:00:00.000 187+282 6   4
2013-10-01 00:00:00.000 187+282 17  121
2013-10-01 00:00:00.000 187+282 18  214
2013-10-01 00:00:00.000 187+282 19  204
2013-10-01 00:00:00.000 72  1   0
2013-10-01 00:00:00.000 72  2   31
2013-10-01 00:00:00.000 72  3   116
2013-10-01 00:00:00.000 72  6   32

如果您的数据具有187和282的重叠周期,则总和将包含两个部分到1列。