我已经在excel中获得了系统的原型,我现在正尝试将其迁移到t-sql中,以便与Access数据库C#一起使用。
无论如何,我有一张这样的表:
所需的输出如下所示:
因此,据我了解查询语法,Group by
和Sum
是关键所在。但是,我不知道如何执行多条件Group by
,并创建表部件。不确定我是否需要Distinct
,因为Group by基本上是相同的。
到目前为止,这就是我所拥有的
OleDbDataAdapter da = new OleDbDataAdapter("Select DISTINCT ([Locale]), SUM([Value]) AS 'Totals' FROM [" + Current_Table + "] GROUP BY [Locale]", connection);
这实际上并不是我想要它做的,它收集Locale的总值,但它忽略了类型。但是我认为这是朝着正确方向迈出的一步,我只是不知道如何涉及更多条件,因为编译器不断丢失操作符错误。
我是否正确认为这是一个多重查询问题?在我生成第一列之后,我需要编写另一个查询或下一个查询并将其附加到临时列等?或者这可以一次完成吗?在Excel中执行此操作非常容易。
关于数据透视,我的当前流程是否正确,因为使用As
函数生成了新列?
答案 0 :(得分:2)
我不知道ms-access是否支持此语句,但这里是可以提供结果的查询。作为输入,我使用了截图的行。正如您在使用PIVOT时所看到的,您需要知道前面的列名。如果不是,你需要使用动态查询,我不认为ms-access会支持这个。
DECLARE @t TABLE (VALUE INT, LOCALE VARCHAR(255), [TYPE] VARCHAR(255))
INSERT INTO @t VALUES
(7,'Argentina','Expense'),
(8,'Columbia','Revenue'),
(9,'Antarctica','Other'),
(99,'Argentina','Expense'),
(12,'Columbia','Revenue'),
(12,'Columbia','Expense'),
(50,'Argentina','Other')
SELECT pivr.TYPE, pivr.Antarctica, pivr.Argentina, pivr.Columbia, tot.Total
FROM
(
SELECT *
FROM (
SELECT 1 AS sort, t.Value, t.Locale, t.[Type]
FROM @t AS t
UNION ALL
SELECT 2 AS sort, SUM(t.Value), t.Locale, 'Total'
FROM @t AS t
GROUP BY t.LOCALE
) AS s
PIVOT
(
SUM(VALUE) FOR LOCALE IN (Argentina,Columbia,Antarctica)
) piv
) AS pivr
LEFT OUTER JOIN
(
SELECT [Type], SUM(Value) AS Total
FROM @t
GROUP BY [Type]
UNION
SELECT 'Total', Sum(VALUE)
FROM @t) AS tot
ON tot.[Type] = pivr.[Type]
结果
TYPE Antarctica Argentina Columbia Total
------------------------------------------------
Expense NULL 106 12 118
Other 9 50 NULL 59
Revenue NULL NULL 20 20
Total 9 156 32 197
答案 1 :(得分:0)
对于未来的读者,答案非常简单。您正在寻找的是您可能从Excel中听到的数据透视功能。这存在于Access以及其他RDBMS
中。这就是我的定义(不同的例子):
TRANSFORM SUM(Amount_USD) AS Sums SELECT DISTINCT Accounts AS Unadjusted FROM [" + Current_Table + "] GROUP BY Accounts PIVOT Status
凯文的建议也是另一种方法,但价值最终会被硬编码。通过这种方式,您将使用Access
的原生功能(如果您正在使用的话,还有一个加号),并且您将保持简单。
您可以将该行代码作为OleDb
命令的查询。
我提前道歉,因为我必须回答我自己的问题。