当前位置: 首页 > 面试题库 >

使用数据透视表的动态列的SQL查询

贝嘉泽
2023-03-14
问题内容

我知道这个话题无处不在,但我无法使其正常运行。这可能很简单。

这是基本查询后的数据示例:

-----------------------------------
|Site| Model              | Count |
-----------------------------------
AAA   ProLiant DL380 G7     1
AAA   OptiPlex 790          500
BBB   OptiPlex 780          80
CCC   OptiPlex 790          23
...

我想要的是列名称是动态的:

--------------------------------------------------------
|Site| ProLiant DL380 G7 | OptiPlex 790 | OptiPlex 780 |...
--------------------------------------------------------
AAA             1               500            0
BBB             0               0              80
CCC             0               23             0

到目前为止,根据我的研究,这是我整理的代码:

DECLARE 
    @cols AS NVARCHAR(MAX),
    @query AS NVARCHAR(MAX)

SELECT @cols = STUFF((SELECT DISTINCT ',' + QUOTENAME(Model)
     FROM
    (
        SELECT IIF(COMP.Manufacturer0 LIKE '%lenovo%',PRD.Version0,COMP.Model0) AS Model
        FROM v_GS_COMPUTER_SYSTEM COMP
        JOIN v_GS_COMPUTER_SYSTEM_PRODUCT PRD ON COMP.ResourceID=PRD.ResourceID
    ) AS inner_tbl
    FOR XML PATH(''),Type).value('.', 'NVARCHAR(MAX)'),1,1,'')

SET @query = 'SELECT Site, ' + @cols + ' FROM
    (
        SELECT Site, Model, COUNT(Model) AS Count FROM
        (
            SELECT UPPER(Substring(SYS.Name0,2,3)) AS Site, IIF(COMP.Manufacturer0 LIKE ''%lenovo%'',PRD.Version0,COMP.Model0) AS Model
            FROM v_GS_System SYS
            JOIN v_GS_COMPUTER_SYSTEM COMP ON SYS.ResourceID=COMP.ResourceID
            JOIN v_GS_COMPUTER_SYSTEM_PRODUCT PRD ON SYS.ResourceID=PRD.ResourceID
        ) AS inner_tbl2
        GROUP BY Site, Model
    ) AS inner_tbl1
    PIVOT
    (
        max(Model)
        FOR Site in ' + @cols + ')
    ) AS piv

'

EXECUTE(@query)

当我运行查询时,出现语法错误。


问题答案:

使用动态SQL

IF OBJECT_ID('tempdb..#TempData', 'U') IS NOT NULL 
DROP TABLE #TempData;

CREATE TABLE #TempData (
    [Site] CHAR(3) NOT NULL,
    Model VARCHAR(30) NOT NULL,
    SomeCount INT NOT NULL DEFAULT(0)
    );
INSERT #TempData (Site, Model, SomeCount) VALUES
    ('AAA', 'ProLiant DL380 G7', 1), 
    ('AAA', 'OptiPlex 790', 500), 
    ('BBB', 'OptiPlex 780', 80),
    ('CCC', 'OptiPlex 790', 23);

Declare @DynamicCol nvarchar(max),@DynamicColNull nvarchar(max)
        ,@Sql nvarchar(max)

SELECT @DynamicColNull=STUFF((SELECT DISTINCT ', '+'ISNULL('+QUOTENAME(Model),','+'''0'''+') As '+QUOTENAME(Model)
                        FROM #TempData FOR XML PATH ('')),1,2,'')

SELECT @DynamicCol=STUFF((SELECT DISTINCT ', '+QUOTENAME(Model) FROM #TempData FOR XML PATH ('')),1,2,'')

SET @Sql='SELECT [Site], '+@DynamicColNull+' From
            (   
            SELECT * from #TempData
            )
            AS Src
            PIVOT
            (
            MAX(SomeCount) FOR [Model] IN ('+@DynamicCol+')
            )AS Pvt'
PRINT @Sql
EXEC(@Sql)

结果

Site    OptiPlex 780    OptiPlex 790    ProLiant DL380 G7
AAA         0               500             1
BBB         80              0               0
CCC         0               23              0


 类似资料:
  • 问题内容: 我已经尽力理解如何在SQL中创建数据透视表,但是我无法对其进行管理! 我有以下几列: 拥有60万行数据。 我在下面的数据透视表中需要它们; StartHour作为列标题 作为行标题 作为数据 其中=‘1’作为过滤器。 数据透视表 我设法获得了以下代码,该方法有效,但仅给我date_1作为列标题,而不给我StartHour,或者将filter作为date_source =‘1’。 谢谢你

  • 问题内容: 我找到了一个不错的脚本,该脚本可以为透视表动态按列名创建,但是我没有将分配的值重新返回到表中。这是我的出发桌。 我运行此SQL生成我想要的数据透视表中的列 这给了我以下输出 当我为数据透视表运行动态SQL时 我看到这个结果… 我尝试了几种不同的方法,但是对于这种方法为什么不起作用,我没有提出解决方案。 所需的输出将是ORDER_ID列顺序正确的位置 但这也将对我的应用程序起作用。 问题

  • 问题内容: 我正在尝试动态地旋转表,但无法获得所需的结果。这是创建表的代码 到目前为止编写的代码....这将列套和jib_in旋转为行,但这仅是两个ROWS,即我在PIVOT函数下放入聚合函数中的一个,以及我在QUOTENAME()中放入的行 我需要所有列进行旋转并显示在旋转表上。任何帮助,将不胜感激。我是动态枢纽领域的新手。我尝试了很多添加其他列的方法,但无济于事!!我知道还有其他方法,如果有其

  • 问题内容: 我正在使用下表存储产品数据: 使用以下查询从两个表中选择记录 一切都正常工作:) 因为我动态地填充了“附加”表,所以如果查询也是动态的,那就很好了。这样,我不必每次输入新的字段名和字段值就更改查询。 问题答案: MySQL中动态执行此操作的唯一方法是使用Prepared语句。这是一篇关于它们的好文章: 动态数据透视表(将行转换为列) 您的代码如下所示: 观看演示 注意:GROUP_CO

  • 问题内容: 以下查询执行得很好… 输出看起来像 但是我的疑问是如何获取列的动态字段值。 那是 , 如何使用以上查询 问题答案: 要使PIVOT动态,您必须编写一个存储过程。 然后,您可以这样称呼它:

  • 问题内容: …枢轴((X)中B的总和(A)) 现在,B的数据类型为varchar2,X为一串由逗号分隔的varchar2值。 X的值是从同一表的列(例如CL)中选择不同的值。这种枢轴查询工作的方式。 但是问题是,每当CL列中有一个新值时,我都必须手动将其添加到字符串X中。 我尝试用从CL选择不同的值替换X。但是查询未运行。 我感觉到的原因是因为要替换X,我们需要用逗号分隔的值。 然后,我创建了一个