按月查看SUM

时间:2013-01-25 16:30:38

标签: sql sql-server-2008 ms-access-2010

这是我在SQL 2008 View中的陈述。

SELECT TOP (100) PERCENT
    dbo.[Billing Detail].Chart
,   dbo.[Billing Detail].[Transaction Code]
,   SUM(dbo.[Billing Detail].Units) AS [Total Billed]
FROM
    dbo.[Billing Detail]
    INNER JOIN dbo.Patient
    ON dbo.[Billing Detail].Chart = dbo.Patient.[Chart Number]
WHERE
    (dbo.[Billing Detail].[Transaction Code] = 'H2016')
    AND (dbo.[Billing Detail].[Service Date 1] BETWEEN '2013-1-01 00:00:00.000'
                                               AND     '2013-1-31 00:00:000')
GROUP BY
    dbo.[Billing Detail].Chart
,   dbo.[Billing Detail].[Transaction Code]
ORDER BY
    dbo.[Billing Detail].Chart

我正在尝试制作一个IF声明,其中1-1-13和1-31-13输出的单位的SUM是1月,所有日期在2-1-13和2-28-13之间= FEB。 ..等等一年中剩下的时间。然后,我需要将此信息导出到Access 2010或Excell 2010。

3 个答案:

答案 0 :(得分:2)

我认为您的观点应该是这样的。最后两个WHERE子句假设您希望对视图进行硬编码以仅处理2013年(以及here is why you shouldn't use BETWEEN)。如果您希望能够使用任何年份的视图,只需删除这两个子句,并在从视图中选择时应用它们(就像您应该使用ORDER BY一样)。

SELECT
  [month] = DATEADD(MONTH, DATEDIFF(MONTH, 0, bd.[Service Date 1]), 0),
  bd.Chart,
  bd.[Transaction Code], 
  SUM(bd.Units) AS [Total Billed]
FROM
  dbo.[Billing Detail] AS bd
INNER JOIN
  dbo.Patient AS p
  ON bd.Chart = p.[Chart Number]
WHERE
  bd.[Transaction Code] = 'H2016'
  AND bd.[Service Date 1] >= '20130101'
  AND bd.[Service Date 1] < '20140101'
GROUP BY 
  DATEADD(MONTH, DATEDIFF(MONTH, 0, bd.[Service Date 1]), 0);

现在您可以自行将此数据导入Excel或Access。如果它是一次性任务,Excel几乎可以将结果导入网格或结果导出到文件输出。如果您需要自动化它,您可以尝试使用链接服务器,但您可能会从不同的角度更好地接近它:链接到Access中的视图或具有外部应用程序(例如,C#命令行,PowerShell等)读取结果,然后以您需要的文件格式输出(.CSV通常最简单,具体取决于数据)。

答案 1 :(得分:0)

这就是我要做的事情:

  1. 编写一个类似于您所拥有的查询的查询,该查询涵盖您想要涵盖的整个日期范围,即将年份和月份的单位分组(如果您仅涵盖一年,则仅为月份)。

  2. 将数据导出到Access或Excel。您可以通过ODBC将Access连接到数据库表;您可以在Excel中执行类似的操作,或者使用SSMS将查询结果导出到CSV文件并将其导入到您选择的工具中。 (SSIS会更好,但如果你没有,那仍然可以做到。)

  3. 使用Access或Excel,将Month字段上的数据转换为所需的布局。

  4. 虽然您可以在SQL中使用PIVOT关键字并获取每个月的列,但您必须进行大量的输入,并且不会获得任何向导类型的指导。在Access或Excel中,有一个易于使用的界面来设置数据透视表并调整汇总行或小计等内容。

答案 2 :(得分:0)

如果我正确理解您的问题,您希望为每个月添加列,然后将这些日期范围的单位相加?

假设是这样,这样的事情可能会起作用(我已经简化了你的表结构,但这应该让你朝着正确的方向前进):

SELECT ID, Month, SUM(Units)
FROM (
SELECT  ID, Units, 
    CASE 
       WHEN Month(dt) = 1 THEN 'Jan'
       WHEN Month(dt) = 2 THEN 'Feb'
       WHEN Month(dt) = 3 THEN 'Mar'
    END as Month
FROM         Sample
) t
GROUP BY ID, Month

SQL Fiddle

- 编辑

实际上,根据您所需的结果,最好在WHERE标准中包含Year而不是CASE语句。真的取决于你的数据...

SELECT ID, Month, SUM(Units)
FROM (
SELECT  ID, Units, 
    CASE 
       WHEN Month(dt) = 1 THEN 'Jan'
       WHEN Month(dt) = 2 THEN 'Feb'
       WHEN Month(dt) = 3 THEN 'Mar'
    END as Month
FROM         Sample
WHERE Year(dt) = 2013
) t
GROUP BY ID, Month