1

我不确定如何准确命名我想要做的事情,所以让我从一个例子开始。

假设我的数据库中的一张表包含系统中可以随时增长的所有餐厅。此表中的所有记录都是唯一的。为了争论,假设餐厅的桌子看起来像这样

身份证 | 顾客姓名
----|--------------
 麦克 | 麦当劳
 黑白 | 汉堡王
 wd | 温迪斯
 sw | 地铁

现在我想了解一下如何动态地获取它并在 select 语句中将它们设为列,我将在其中调用标量函数以返回一些值。我应该注意我的最终目标是使用另一个 3rd 方控件生成折线图,以显示每天的相关定量数据,例如总销售额。

使用上面的餐厅表,选择语句将读取每一行当天的总销售额小数:

基本上,我希望返回集看起来像这样,以便轻松地将其粘贴到我正在使用的图表控件中。

    日期 | 麦当劳 | 汉堡王 | 温迪斯 | 地铁
------------|---------|--------------|---------|- ------
 2013 年 11 月 1 日 | 507.68 美元 | $300.01 | 567.99 美元 | 423.56 美元
 2013 年 11 月 2 日 | 667.98 美元 | 202.55 美元 | 864.35 美元 | 143.36 美元

等等

我不需要帮助编写函数,只是指出了如何拥有一组动态列的正确方向。

谢谢您的帮助。

4

2 回答 2

1
If OBJECT_ID('tempdb..#Restaurants') Is Not Null Drop Table #Restaurants
If OBJECT_ID('tempdb..#Sales') Is Not Null Drop Table #Sales

Create Table #Restaurants(
ID int,
Name varchar(50)
)
Insert Into #Restaurants Values
(1, 'McDonalds'),
(2, 'Burger King'),
(3, 'Wendys'),
(4, 'Subway')

Create Table #Sales(
ID int,
SaleDate Date,
Amount decimal(18, 2)
)
Insert Into #Sales Values
(1, '20131115', 1000),
(1, '20131116', 1500),
(2, '20131115', 500),
(2, '20131116', 800),
(3, '20131115', 700),
(3, '20131116', 600),
(4, '20131115', 2000)

Declare @PivotList varchar(max)
Select @PivotList = COALESCE(@PivotList+ ', ', '') + '['+Name+']'
From #Restaurants

Declare @Query nvarchar(max) = 'Select *
From(
Select SaleDate, Name, Amount
From #Restaurants a
Join #Sales b On a.ID = b.ID
) a
Pivot(
Sum(Amount) For Name In ('+@PivotList+')
) As PVOT'
Execute (@Query)
于 2013-11-15T18:19:06.493 回答
0

大多数为呈现此类信息而设计的工具旨在接收扁平数据集。您可以通过编写查询而不尝试动态生成列来解决此问题,而只是将数据从数据库中取出并交给控件。

对于您的数据集,这看起来像这样:

11/1/2013 BK $1,355,243.23
11/2/2013 BK $253,546.45
11/1/2013 WD $2.24

此时您所做的是将日期放在行中,将餐厅标题放在列中,并将聚合函数放在单元格中。

此特定功能存在于 SQL Server 报告工具和许多其他第 3 方可视化工具中。我希望这也存在于你的身上。

于 2013-11-15T17:42:10.040 回答