从一个表中获取值并在Select语句中使用它们

时间:2013-11-15 17:03:14

标签: sql sql-server select dynamic-columns

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

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

 ID | Customer Name
----|--------------
 mc |  McDonalds
 bk | Burger King
 wd |   Wendys
 sw |   Subway

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

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

基本上,我希望返回设置看起来像这样容易将其粘贴到我正在使用的图表控件中。

    Date    |  McD's  |  Burger King |  Wendys  | Subway
------------|---------|--------------|----------|-------
 11/01/2013 | $507.68 |    $300.01   |  $567.99 | $423.56
 11/02/2013 | $667.98 |    $202.55   |  $864.35 | $143.36

等等

我不需要帮助编写函数,只是指出了如何使用动态列集的正确方向。

感谢您的帮助。

2 个答案:

答案 0 :(得分: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)

答案 1 :(得分:0)

大多数用于呈现此类信息的工具都是为了采用扁平化数据集而设计的。您可以通过编写查询来解决此问题,而无需动态生成列,而只是将数据从数据库中移出并控制到控制之中。

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

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

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

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