C# 使用 T-Sql Group by 模拟 Excel 枢轴特征

C# Simulating Excel pivot feature with T-Sql Group by

我已经在 excel 中获得了系统的原型,现在我正在尝试将其迁移到 t-sql,以便与 Access 数据库、C# 一起使用。

无论如何,我有一个 table 这样的:

所需的输出如下所示:

据我了解查询语法,Group bySum 是这里的关键。但是,我不知道如何执行多重条件 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 命令的查询。

我提前道歉,因为我不得不回答我自己的问题。