2013-06-02 40 views
0

有人請請幫助我。 我試圖做一些看起來很簡單和容易。但我似乎無法弄清楚。我怎樣才能創建一個數據透視表與經典的ASP vb

我試圖將我的數據顯示爲數據透視表而不是'正常顯示' 這就是現在的樣子。

Store, Product, amount 
store1, potatoes, 10 
store2, strawberry, 20 

但我想要的是:

Product Store1 Store2 Total 
potatoes 10     10 
strawberry   20  20 

這是使用代碼IM:


Dim rsMenu1 
    Set rsMenu1 = Server.CreateObject("ADODB.Recordset") 
    rsMenu1.ActiveConnection = ConnectString 
    dim sql 
    sql = "SELECT store.storeOms, datepart(wk,voorraad.datum) as week, products.prodOms, SUM  (voorraad.besteld) AS besteld FROM products" 
    sql = sql & " INNER JOIN voorraad ON products.prodId = voorraad.prodId INNER JOIN store " 
    sql = sql & " ON voorraad.storeId = store.storeId " 
    sql = sql & " WHERE datepart(wk,datum) =" & request.querystring("q") 
    sql = sql & " AND voorraad.besteld > 0" 
    sql = sql & " GROUP BY store.storeOms, voorraad.datum, products.prodOms" 

    response.Write(sql) 

    rsMenu1.Source = sql 
    rsMenu1.Open() 
    %> 

<table width="200" border="0" class="table table-hover"> 

    <tr> 
    <th>Winkel</th> 
    <th>Product</th> 
    <th>Aantal besteld</th> 
    </tr> 
    <%do until rsMenu1.EOF%> 
    <tr> 
    <td><%=rsMenu1.Fields.Item("storeOms").Value%></td> 
    <td><%=rsMenu1.Fields.Item("prodOms").Value%></td> 
    <td><%=rsMenu1.Fields.Item("besteld").Value%></td> 

    </tr> 
    <%rsMenu1.Movenext 
    Loop%> 

回答

1

你應該能夠轉動直接使用SQL的數據。您可以使用聚合函數類似如下的CASE表達式:

select product, 
    sum(case when store = 'store1' then amount else 0 end) Store1, 
    sum(case when store = 'store2' then amount else 0 end) Store2, 
    sum(amount) Total 
from yd 
group by product; 

SQL Fiddle with Demo

然後添加以下內容到現有的查詢代碼將與此類似:

SELECT products.prodOms, 
    sum(case when store.storeOms = 'store1' then voorraad.besteld else 0 end) Store1, 
    sum(case when store.storeOms = 'store2' then voorraad.besteld else 0 end) Store2, 
    SUM(voorraad.besteld) AS Total, 
    datepart(wk,voorraad.datum) as week 
FROM products 
INNER JOIN voorraad 
    ON products.prodId = voorraad.prodId 
INNER JOIN store 
    ON voorraad.storeId = store.storeId 
WHERE datepart(wk,datum) =yourDate 
    AND voorraad.besteld > 0 
GROUP BY products.prodOms, datepart(wk,voorraad.datum) 

由於您使用的SQL Server 2005+,那麼你可以使用旋轉功能,如果您有數目不詳的那麼你可以在存儲過程中使用動態SQL來獲得結果。基本語法爲:

DECLARE @cols AS NVARCHAR(MAX), 
    @query AS NVARCHAR(MAX), 
    @yourDate as datetime 

select @cols = STUFF((SELECT distinct ',' + QUOTENAME(storeOms) 
        from store 
      FOR XML PATH(''), TYPE 
      ).value('.', 'NVARCHAR(MAX)') 
     ,1,1,'') 

set @query = 'SELECT products.prodOms,' + @cols + ', Total , week 
      from 
      (
       select products.prodOms, store.storeOms, 
        voorraad.besteld, datepart(wk,voorraad.datum) as week, 
        sum(voorraad.besteld) over(partition by products.prodOms, datepart(wk,voorraad.datum)) Total 
       FROM products 
       INNER JOIN voorraad 
        ON products.prodId = voorraad.prodId 
       INNER JOIN store 
        ON voorraad.storeId = store.storeId 
       WHERE datepart(wk,datum) = '''+convert(varchar(10), yourDate, 120)+''' 
        AND voorraad.besteld > 0 
      ) x 
      pivot 
      (
       sum(besteld) 
       for storeOms in (' + @cols + ') 
      ) p ' 

execute(@query) 
+0

非常感謝您的維修人員。這真的很有幫助,但我遇到的問題是商店是動態的。所以store1將來可以有1個商店。 CA你幫我找出這一個出來。 – JsChoice

+0

@JsChoice你在使用什麼數據庫和什麼版本? – Taryn

+0

嗨bluefeet我正在使用SqlServer 2008。 – JsChoice

相關問題