2017-04-27 59 views
0

我已經將excel中的系統原型下了下來,現在我正嘗試將它遷移到t-sql中,以便與Access數據庫C#一起使用。C#使用T-Sql組模擬Excel數據透視圖功能

不管怎麼說,我有這樣的一個表:

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); 

這實際上並沒有做我想做的事情,它收集區域設置的總價值,但它忽略類型。但是我認爲這是朝着正確的方向邁出的一步,我不知道如何涉及更多的條件,因爲編譯器繼續吐出缺少的操作錯誤。

我正確地認爲這是一個多重查詢問題嗎?在生成第一列之後,我需要編寫另一個查詢或下一個查詢並將其追加到臨時列等?或者可以一次完成嗎?在Excel中做這件事很容易。

關於這個關鍵點,我當前的過程是否正確,因爲這些列是用As函數生成的新函數?

回答

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命令的查詢。

因爲我不得不回答我自己的問題,所以提前表示歉意。

2

我不知道ms-access是否會支持這條語句,但這裏是可以提供結果的查詢。作爲輸入,我使用了屏幕截圖的行。正如您在使用PIVOT時看到的,您需要知道前面的列名。如果沒有,你將需要去動態查詢,我不認爲ms訪問會支持這一點。

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 
+0

我試過了,它似乎按預期工作。但是,最近我瞭解到MS Access的一個特性,它簡化了我的這個問題,代碼如下:'TRANSFORM SUM(Amount_USD)AS總和SELECT DISTINCT帳戶作爲未調整FROM [「+ Current_Table +」] GROUP BY帳戶PIVOT狀態「雖然你的回答確實指向了我正確的方向! – Arvayne