0

这是我在 SQL 2008 视图中的语句。

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 之间的单位总和是 JAN,所有日期在 2-1-13 和 2-28-13 = FEB 之间......在今年剩下的时间里如此。然后我需要将此信息导出到 Access 2010 或 Excell 2010。

4

3 回答 3

2

这是我认为您的视图应该是什么样子的。最后两个WHERE子句假设您想对视图进行硬编码以仅处理 2013 年(这就是您不应该使用的原因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 通常最简单,具体取决于数据)。

于 2013-01-25T16:53:52.437 回答
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 小提琴

- 编辑

实际上,根据您想要的结果,最好将年份包含在 WHERE 标准中,而不是 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
于 2013-01-25T16:44:06.227 回答
0

这是我要做的:

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

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

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

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

于 2013-01-25T16:41:23.493 回答