0

誰かが私を助けてください。とてもシンプルで簡単に見えることをしようとしています。しかし、私はそれを理解できないようです。

「通常のプレゼンテーション」ではなく、ピボット テーブルとしてデータを表示しようとしています。これが現在の外観です。

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%>
4

1 に答える 1

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)
于 2013-06-02T14:10:34.450 に答える