Sql 如何使用经典ASP vb创建透视表

Sql 如何使用经典ASP vb创建透视表,sql,asp-classic,vbscript,pivot,ado,Sql,Asp Classic,Vbscript,Pivot,Ado,谁能帮帮我吗。 我试着做一些看起来很简单的事情。但我似乎不明白 我试图将我的数据显示为透视表,而不是“正常显示” 这就是现在的样子 Store, Product, amount store1, potatoes, 10 store2, strawberry, 20 但我想要的是: Product Store1 Store2 Total potatoes 10 10 strawberry 20 20 这是我使用的代

谁能帮帮我吗。 我试着做一些看起来很简单的事情。但我似乎不明白

我试图将我的数据显示为透视表,而不是“正常显示” 这就是现在的样子

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
dimsql
sql=“选择store.storeOms、datepart(wk、voorraad.datum)作为周、products.prodOms、SUM(voorraad.besteld)作为产品的最佳字段”
sql=sql&“产品上的内部联接voorraad.prodId=voorraad.prodId内部联接存储”
sql=sql&“ON voorraad.storeId=store.storeId”
sql=sql&“WHERE-datepart(wk,datum)=”和request.querystring(“q”)
sql=sql&“和voorraad.besteld>0”
sql=sql&“按store.storeOms、voorraad.datum、products.prodOms分组”
response.Write(sql)
rsMenu1.Source=sql
rsMenu1.Open()
%>
温克尔
产品
安塔尔贝斯菲尔德酒店

您应该能够直接使用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;

然后将其添加到现有查询中,代码将类似于:

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)

非常感谢您的光临。这真的很有帮助,但我的问题是,商店是动态的。因此,store1将来可以有1家店铺。请帮我弄清楚这个问题好吗。@JsChoice您使用的是什么数据库和什么版本?您好,BlueFoots,我使用的是SqlServer 2008。@JsChoice请查看我的编辑,因为您使用的是SqlServer,所以您可以使用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)