当前位置: 首页 > 知识库问答 >
问题:

SQL Server选择查询动态列输出

顾英发
2023-03-14

我想在 SQL Server 2008 中完成以下操作

我有一个如下文章表

| ArticleId | Description |
|-----------+-------------|
|         1 | Test        |
|-----------+-------------|

还有这样的订单预测表。

| ArticleId | Week | Order | Amount |
|-----------+--------------+--------+
|         1 |   51 |     1 |      0 |
|         1 |   52 |     2 |    150 |
|         1 |    1 |     3 |      0 |
|         1 |    2 |     4 |    200 |
|         1 |    3 |     5 |      0 |
|-----------+------+-------+--------+

有没有办法创建一个查询,按照< code>order列的顺序为预测表中的每条记录生成一列。如果可能的话,我怎么能这样做呢?

| ArticleId | Description | Week51 | Week52 | Week1 | Week2 | Week3 |
|-----------+-------------+-----------------+-------+-------+-------+
|         1 | Test        |     0  |    150 |     0 |   200 |     0 |
|-----------+-------------+--------+--------+-------+-------+-------+

共有3个答案

曹智
2023-03-14

您可以使用Pivot尝试下面的查询来获得您想要的结果。

Create Table Article (ArticleId Int, [Description] Varchar(10))
Insert Into Article Values (1, 'Test')

Create Table OrderForecast(ArticleId Int, [Week] Int, [Order] Int, Amount Int)
Insert Into OrderForecast Values (1, 51, 1, 0),(1, 52, 2, 150), (1, 1, 3, 0),(1, 2, 4, 200), (1, 3, 5,0)

Select ArticleId, [Description], Week51, Week52, Week1, Week2, Week3
from
(
  select ArticleId, [Description], Amount, [Week]
  from 
    (
    SELECT OrderForecast.ArticleId, 'Week' + Convert(Varchar(10), OrderForecast.[Week]) as [Week], [Order], Amount, 
        Article.[Description] as [Description] FROM OrderForecast
    Inner Join Article On OrderForecast.ArticleId = Article.ArticleId
    )a
) d
pivot
(
  max(Amount)
  for [Week] in (Week51, Week52, Week1, Week2, Week3)
) piv;

结果将如下所示

ArticleId   Description Week51  Week52  Week1   Week2   Week3
-------------------------------------------------------------
1           Test        0       150     0       200     0

在这里,我使用查询作为表格,因为周是 1、2 等数字,但您希望结果在 Week1、Week2 等中。所以我在数字中连接了单词周,并在透视查询中使用它。

你可以在这里找到现场演示现场演示

赵永新
2023-03-14

在一般情况下,SQL语言严格要求在查询编译时知道结果列的数量和数据类型。在准备执行计划并开始查找数据之前,您在这里要求的内容无法知道。

因此,您通常能够做的最好的事情是将其作为三个单独的步骤运行:

  1. 运行查询以告诉您要使用的列。
  2. 使用#1中的结果即时编写新查询。
  3. 执行新查询并返回结果

即便如此,这种透视通常在您的客户端代码或报告工具中处理得更好。唯一的好消息是,仍然可以用一个长SQL字符串从大多数平台上完成所有这些。

对于这种特定的情况,在您清楚地查看周数的情况下,您可以通过预先假设所有53个可能的周(而不是52个,因为年底有部分周!),并编写一个大的SQL语句,手动计算所有55列(53周文章和描述)。

廖琪
2023-03-14

如果WEEK编号和订单编号一致,保持列顺序是一件小事。

您可能会注意到我使用了#预测和#文章,因为我不知道您的实际表名。

实例

Declare @SQL varchar(max) = '
Select *
 From (
        Select A.ArticleID
              ,D.Description 
              ,B.*
         From  #forecast  A
         Join  #article   D on A.ArticleID=D.ArticleID
         Cross Apply (values (''Week''+left(Week,4),Amount) ) B(Item,Value)
      ) A
 Pivot (max([Value]) 
        For [Item] in (' + Stuff((Select ','+QuoteName('Week'+left(Week,4)) 
                                   From (Select Distinct top 100 [Order],Week From #forecast Order by [Order]  ) A  
                                   For XML Path('')),1,1,'') + ') ) p'
Exec(@SQL);
--Print @SQL

返回

ArticleID   Description Week51  Week52  Week1   Week2   Week3
1           Test        0       150     0       200     0
 类似资料:
  • 问题内容: 我有一个数据库字段名称调用,我正在尝试使用如下所示的变量名称来选择它: 显然,SQL将解释为字符串,而不是数据库的字段,我如何以这种方式将其识别为字段名而不是字符串,可能没有任何select或if语句。 问题答案: 试试这个: 您必须组成一个动态查询,并使用 要在事物的“动态”方面添加更多内容,请使用存储过程。请参见此处的示例: http://www.marten-online.com

  • 问题内容: 我有一张表,默认有20列 这20列名为D1 D2 D3 … D20,现在带有选择查询,我想动态添加其他列。例如,对于D21 D22 … D31,我如何编写查询以动态递增添加此列值..最大限制为31,请帮助 缺省表列 D1 D2 D3 D4 D5 D6 D7 D8 D9 D10 D11 D12 D13 D14 D15 D16 D17 D18 D19 D20 现在我想在连续性将列添加到D2

  • 从表A中选择columnList=>Id1,Id2,Id3,Id4,ID5。 使用结果,我需要从表B中查询。 以下是案例 就像这个案子会变大一样。我想知道如何在Spring Data JPA中实现这一点。它类似于Spring Data JPA中的动态投影。 注意:存储在TableA中的列名在TableB中使用。 理由:如果我能做到这一点,它将很容易拉出数据,这只是我需要的。 我们能使用Criter

  • 问题内容: 我正在使用c#中的linq查询遇到一个问题,我的linq查询如下 我有一个 perfmon 类,它包含诸如(id,counter1,counter2 …)之类的属性,现在有20多个计数器,我已经开发了sql查询以根据参数中传递的计数器名称选择id和计数器,例如,如果我已经传递了counter1,它将仅选择id,counter1(重命名为counter) 如果我将在这里使用开关盒,那么它

  • 我有一个名为TEST的表,列名为col1、col2、col3、col4。。。。。。。。。。所以,从信息模式来看。列我将获得有关此表对象的详细信息。 现在,我想通过从信息_模式中提供列名称,从测试表中构建一个select查询。柱。像这样,从information_schema中选择column_name。表_name='TEST'中的列。这会回来的 col1 col2 col3 我想在selectq

  • 问题内容: 我的SQL代码如下: 等效的linq表达式是什么? 问题答案: 我第一次尝试在 来源 LINQ to SQL中的NOT IN子句