2013-06-02 37 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

相关问题