C#通过

时间:2017-04-27 07:05:04

标签: c# tsql ms-access pivot

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

无论如何,我有一张这样的表:

First table

所需的输出如下所示:

Last Table

因此,据我了解查询语法,Group bySum是关键所在。但是,我不知道如何执行多条件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函数生成了新列?

2 个答案:

答案 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命令的查询。

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