C# 使用 T-Sql Group by 模拟 Excel 枢轴特征
C# Simulating Excel pivot feature with T-Sql Group by
我已经在 excel 中获得了系统的原型,现在我正在尝试将其迁移到 t-sql,以便与 Access 数据库、C# 一起使用。
无论如何,我有一个 table 这样的:
所需的输出如下所示:
据我了解查询语法,Group by
和 Sum
是这里的关键。但是,我不知道如何执行多重条件 Group by
,并创建 table 部分。不确定我是否需要 Distinct
,因为分组依据本质上是一样的。
到目前为止,这就是我所拥有的
OleDbDataAdapter da = new OleDbDataAdapter("Select DISTINCT ([Locale]), SUM([Value]) AS 'Totals' FROM [" + Current_Table + "] GROUP BY [Locale]", connection);
这实际上并没有做我想要它做的事情,它收集了 Locale 的总值,但它忽略了类型。但我认为这是朝着正确方向迈出的一步,我只是不知道如何涉及更多条件,因为编译器不断吐出丢失的运算符错误。
我假设这是一个多查询问题是否正确?在生成第一列之后,我需要在哪里编写另一个查询或下一个查询并将其附加到临时列等?或者这可以一次性完成吗?在 Excel.
中执行此操作要容易得多
关于数据透视表,我当前的过程是否正确,因为列是使用 As
函数生成的新列?
我不知道 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
对于未来的读者来说,答案很简单。您正在寻找的是您可能从 Excel 听说过的枢轴功能。这存在于 Access 以及其他 RDBMS
中。这就是我解决的问题(不同的例子):
TRANSFORM SUM(Amount_USD) AS Sums SELECT DISTINCT Accounts AS Unadjusted FROM [" + Current_Table + "] GROUP BY Accounts PIVOT Status
Kevin 的建议也是执行此操作的另一种方法,但这些值最终将被硬编码。这样,您将使用 Access
的原生功能(加号,如果您正在使用它的话)并且您将让事情变得简单。
您可以将该行代码作为您的 OleDb
命令的查询。
我提前道歉,因为我不得不回答我自己的问题。
我已经在 excel 中获得了系统的原型,现在我正在尝试将其迁移到 t-sql,以便与 Access 数据库、C# 一起使用。
无论如何,我有一个 table 这样的:
所需的输出如下所示:
据我了解查询语法,Group by
和 Sum
是这里的关键。但是,我不知道如何执行多重条件 Group by
,并创建 table 部分。不确定我是否需要 Distinct
,因为分组依据本质上是一样的。
到目前为止,这就是我所拥有的
OleDbDataAdapter da = new OleDbDataAdapter("Select DISTINCT ([Locale]), SUM([Value]) AS 'Totals' FROM [" + Current_Table + "] GROUP BY [Locale]", connection);
这实际上并没有做我想要它做的事情,它收集了 Locale 的总值,但它忽略了类型。但我认为这是朝着正确方向迈出的一步,我只是不知道如何涉及更多条件,因为编译器不断吐出丢失的运算符错误。
我假设这是一个多查询问题是否正确?在生成第一列之后,我需要在哪里编写另一个查询或下一个查询并将其附加到临时列等?或者这可以一次性完成吗?在 Excel.
中执行此操作要容易得多关于数据透视表,我当前的过程是否正确,因为列是使用 As
函数生成的新列?
我不知道 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
对于未来的读者来说,答案很简单。您正在寻找的是您可能从 Excel 听说过的枢轴功能。这存在于 Access 以及其他 RDBMS
中。这就是我解决的问题(不同的例子):
TRANSFORM SUM(Amount_USD) AS Sums SELECT DISTINCT Accounts AS Unadjusted FROM [" + Current_Table + "] GROUP BY Accounts PIVOT Status
Kevin 的建议也是执行此操作的另一种方法,但这些值最终将被硬编码。这样,您将使用 Access
的原生功能(加号,如果您正在使用它的话)并且您将让事情变得简单。
您可以将该行代码作为您的 OleDb
命令的查询。
我提前道歉,因为我不得不回答我自己的问题。