2013-06-02 2 views
0

Может кто-то пожалуйста, пожалуйста, помогите мне. Im пытается сделать что-то, что выглядит довольно простым и легким. Но я не могу понять это.как я могу создать сводную таблицу с классическим ASP vb

Im пытается отобразить мои данные как сводную таблицу вместо «нормального представления» Это то, на что похоже сейчас.

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

Но что я хочу это:

Product Store1 Store2 Total 
potatoes 10     10 
strawberry   20  20 

Это код им с помощью:


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+, то вы можете использовать функцию PIVOT и если у вас есть неизвестное количество затем вы можете использовать динамический 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 магазин в будущем. Не поможешь мне разобраться в этом. – JsChoice

+0

@JsChoice Какую базу данных вы используете и какую версию? – Taryn

+0

Hi bluefeet Я использую SqlServer 2008. – JsChoice

Смежные вопросы