sql - SQL 查询中的汇总和总发票数据

标签 sql sql-server

我需要一个可以放入报表显示工具(如 Crystal Reports 或 Report Writer)的完整查询。

我几乎已经开始工作了,但我似乎无法获得 总计 排在底部。

SQL Fiddle 不会建立这个表,说内存不足。 (???) 所以,我所能做的就是把它贴在这里。

这是我的示例表:

CREATE TABLE [dbo].[jp2Invoice](
    [Id] [int] IDENTITY(1,1) NOT NULL,
    [InvoiceNumber] [varchar](20) NOT NULL,
    [Subtotal] [decimal](9, 4) NOT NULL,
    [Taxable] [varchar](1) NULL,
    [TaxRate] [decimal](9, 4) NULL,
    [TaxableAmount] [decimal](9, 4) NOT NULL,
    [NontaxableAmount] [decimal](9, 4) NOT NULL,
    [Tax] [decimal](9, 4) NOT NULL,
    [Total] [decimal](9, 4) NOT NULL,
    [AmountTendered] [decimal](9, 4) NOT NULL,
    [ChangeAmount] [decimal](9, 4) NOT NULL,
    [AmountDue] [decimal](9, 4) NOT NULL,
    [ChargeAmount] [decimal](9, 4) NOT NULL,
 CONSTRAINT [PK_jp2Invoice] PRIMARY KEY CLUSTERED ([Id] ASC) ON [PRIMARY]
) ON [PRIMARY]

以下是一些示例数据:
insert into jp2Invoice(
  InvoiceNumber, Subtotal, Taxable, TaxRate, TaxableAmount, NontaxableAmount, Tax, Total, AmountTendered, ChangeAmount, AmountDue, ChargeAmount
) values 
('ABC001',  19.9500, 'Y', 8.2500,  19.9500,   0.0000,  1.6458,  21.5958,  40.0000, 18.4041,   0.0000,   0.0000),
('ABC002', 558.8300, 'Y', 6.0000, 335.3000, 223.5300, 20.1180, 355.4180,   0.0000,  0.0000,   0.0000, 355.4180),
('ABC003', 281.4700, 'Y', 8.2500, 281.4700,   0.0000, 23.2212, 304.6912,   0.0000,  0.0000,   0.0000, 304.6913),
('ABC004',  95.9800, 'Y', 8.2500,  95.9800,   0.0000,  7.9183, 103.8983,   0.0000,  0.0000,   0.0000, 103.8983),
('ABC005',  73.1900, 'Y', 8.2500,  73.1900,   0.0000,  6.0381,  79.2281, 100.0000, 20.7718,   0.0000,   0.0000),
('ABC006', 215.6500, 'N', 0.0000,   0.0000, 215.6500,  0.0000, 215.6500,   0.0000,  0.0000,   0.0000, 215.6500),
('ABC007', 146.0200, 'Y', 8.2500, 146.0200,   0.0000, 12.0466, 158.0666,   0.0000,  0.0000,   0.0000, 158.0667);

有了这些数据,我创建了这个查询:
select
 case when ChargeAmount=0 then 'Cash' else 'Charge' end as 'TxType',
 TaxRate,
 sum(Subtotal) as 'SubTotal',
 sum(TaxableAmount) as 'TaxAmt',
 sum(AmountTendered) as 'Tendered',
 sum(ChangeAmount) as 'Change',
 sum(ChargeAmount) as 'Charged',
 sum(Total) as 'Total'
from jp2Invoice
group by case when ChargeAmount=0 then 'Cash' else 'Charge' end,
 TaxRate

该查询生成下表:
TxType TaxRate  SubTotal      TaxAmt    Tendered     Change  Charged    Total
Charge  0.0000  215.6500      0.0000      0.0000     0.0000 215.6500    215.6500
Charge  6.0000  558.8300    335.3000      0.0000     0.0000 355.4180    355.4180
Cash    8.2500   93.1400     93.1400    140.0000    39.1759   0.0000    100.8239
Charge  8.2500  523.4700    523.4700      0.0000     0.0000 566.6563    566.6561

第一:看起来该表首先按税率分组,然后按“TxType”分组,即使 分组由 子句显示“TxType”计算首先出现。我如何强制“现金”先到,然后“收费”来?

第二:我该怎么写总计 底部的行与显示总数的计算?我在下面的示例表中手动计算了一个:
TxType TaxRate  SubTotal      TaxAmt    Tendered     Change  Charged    Total
Charge  0.0000  215.6500      0.0000      0.0000     0.0000  215.6500    215.6500
Charge  6.0000  558.8300    335.3000      0.0000     0.0000  355.4180    355.4180
Cash    8.2500   93.1400     93.1400    140.0000    39.1759    0.0000    100.8239
Charge  8.2500  523.4700    523.4700      0.0000     0.0000  566.6563    566.6561
Totals         1391.0900    951.91      140.0000    39.1759 1137.7243   1238.5480

可能有一些错别字,因为它都是手工编辑的。

如何让数据首先通过 TxType 显示并在底部显示总计行?

最佳答案

在 SQL Server 中,您可以使用 WITH ROLLUP 获取总计行并使用 ORDER BY 对您的行进行排序。您还可以使用 GROUPING() 添加“TOTALS”标签。

select
 CASE WHEN GROUPING(case when ChargeAmount=0 then 'Cash' else 'Charge' end) = 1 THEN 'Total' ELSE case when ChargeAmount=0 then 'Cash' else 'Charge' end END as 'TxType',
 TaxRate,
 sum(Subtotal) as 'SubTotal',
 sum(TaxableAmount) as 'TaxAmt',
 sum(AmountTendered) as 'Tendered',
 sum(ChangeAmount) as 'Change',
 sum(ChargeAmount) as 'Charged',
 sum(Total) as 'Total'
from jp2Invoice
group by case when ChargeAmount=0 then 'Cash' else 'Charge' end,
 TaxRate WITH ROLLUP

ORDER BY case when ChargeAmount=0 then 'Cash' else 'Charge' end

关于sql - SQL 查询中的汇总和总发票数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35583753/

相关文章:

mysql - 如何从下表中选择用户好友的帖子?

sql - SQL 中的句号/大写字母

sql - 使用 INSERTED 和 DELETED from 和 OUTPUT

java - 线程中出现异常 "AWT-EventQueue-0"java.lang.ClassCastException

mysql - 使用许多 LEFT JOIN 提高 SQL 查询的性能

mysql - 使用 SELECT 子查询的结果更新列

mysql - 有没有理由不在每个表中放置时间戳?

sql-server - SQL Server 索引 View 列精度

sql - 在sql server management studio 2014中重命名数据库名称

sql-server - 使用 SSIS DatFlowTask 将数据从 SQL Server 导出到 Excel 时如何避免 'number stored as text' 错误