根据每月的输入日期选择项目总和

时间:2013-07-05 10:27:50

标签: sql sql-server tsql

我正在尝试根据每月的输入日期选择项目总和:

库存表格如下:

    EntryDate    Items

    1/1/2013      2
    1/20/2013     5
    1/23/2013     3
    1/30/2013     2
    2/4/2013      4
    2/17/2013     34 

添加了总行的所需输出:

    EntryDate    Items

    1/1/2013        2
    1/20/2013       5
    1/23/2013       3
    1/30/2013       2
    **Total         12**
    2/4/2013        4
    2/17/2013       34 
    **Total         38**

以下是我的尝试。我正在尝试使用汇总来执行此操作,但它会立即计算所有项目而不是按月计算,如何实现此目的:

Select Convert(date, EntryDate) AS [DATE],SUM(Items) AS Total, 
Case WHEN GROUPING(Items) = 1 THEN 'Rollup'
Else Status end AS Total From [Inventory]  Group by Convert(date, EntryDate) WITH 
Rollup

5 个答案:

答案 0 :(得分:4)

如果您确实需要类似示例的结果,可以使用以下内容:

SELECT EntryDate, Items
FROM (SELECT YEAR(EntryDate)'Year_',MONTH(EntryDate)'Month_',CAST(EntryDate AS VARCHAR(12))'EntryDate',Items,1 'sort'
      FROM Inventory
      UNION ALL
      SELECT YEAR(EntryDate)'Year_',MONTH(EntryDate)'Month_','Total',SUM(Items)'Items',2 'sort'
      FROM Inventory
      GROUP BY YEAR(EntryDate),MONTH(EntryDate)
      )sub
ORDER BY Year_,Month_,sort

演示:SQL Fiddle

答案 1 :(得分:1)

试试这个,它会在新栏目中为您提供月份总数,当您的日期超过1年时,它也可以使用

SELECT EntryDate, Items, 
SUM(Items) OVER (partition by dateadd(month, datediff(month, 0, entrydate), 0)) Total 
FROM [Inventory]

结果:

EntryDate   Items   Total
2013-01-01  2       12
2013-01-20  5       12
2013-01-23  3       12
2013-01-30  2       12
2013-02-04  4       38
2013-02-17  34      38

答案 2 :(得分:0)

DATEPART 会尝试这个,

SELECT DATEPART(month, EntryDate) AS 'Month Number',sum(items1) FROM ITEMS
GROUP BY DATEPART(month, EntryDate)

# sqlfiddle

答案 3 :(得分:0)

这是一个完美的解决方案

select isnull(cast(DATEFROMPARTS(year,month,day) as varchar),'Total'), 
       items 
  from (  SELECT datepart(yyyy,EntryDate) year,
                 DATEPART(mm, EntryDate) month, 
                 DATEPART(dd, EntryDate) day,
                 sum(items) items
            From Inventory 
        GROUP BY 
          ROLLUP (datepart(yyyy,EntryDate),
                  DATEPART(mm, EntryDate), 
                  DATEPART(dd, EntryDate) 
                 )
       ) a
 where a.year is not null
   and a.month is not null;

Demo HERE

答案 4 :(得分:0)

尝试:

 select entryDate, Items, sum(Items) 
     from (select entryDate,Items, to_date(entry_date, 'mm/yyyy') month_date from Inventory) 
     group by month_date