SQL Server SQL -还原从数据库表查询的追加行

vmdwslir  于 2023-01-25  发布在  其他
关注(0)|答案(2)|浏览(121)

我正尝试通过SQL查询反转或透视表中追加的行。
| 时间戳|识别号|价值|
| - ------|- ------|- ------|
| 2023年1月18日|A类|十个|
| 2023年1月19日|A类|十五|
| 2023年1月20日|A类|二十个|
| 2023年1月18日|B|十个|
| 2023年1月19日|B|十五|
| 2023年1月20日|B|二十个|
| 2023年1月18日|C级|十个|
| 2023年1月19日|C级|十五|
| 2023年1月20日|C级|二十个|
并且我正在尝试修改查询以透视或分组行,等效于以下内容:
| 时间戳|A类|B|C级|
| - ------|- ------|- ------|- ------|
| 2023年1月18日|十个|十个|十个|
| 2023年1月19日|十五|十五|十五|
| 2023年1月20日|二十个|二十个|二十个|

此查询的解决方案是什么?

我试过像下面这样旋转查询,根据我的研究,它应该能达到我的期望,但可能我错过了一些东西,因为它返回了下面的错误消息。

SELECT Facility, 
       Site, 
       SUBSTRING(Name,
                 CHARINDEX('_',Name)+1,
                 ( ((LEN(Name)) - CHARINDEX('_', REVERSE(Name))) 
                   - CHARINDEX('_',Name) )
       ) AS Panel, 
       dateadd(hh,-7,TimestampUTC) as TimeStamp, 
       ActualValue 
FROM PSS_KPIHistory 
WHERE Name LIKE '%PercentLoopsInNormal' 
PIVOT(ActualValue for Panel in(select distinct Panel from PSS_KPIHistory))

上述查询返回列Facility、Site、从列“Name”提取的字符串(存储为新列“Panel”)、时间戳和值(ActualValue)。我返回的是“Name”列中包含“PercentLoopsInNormal”的表中的所有内容。这将返回以下错误:
消息=关键字“PIVOT”附近的语法错误。“)”附近的语法错误。

67up9zun

67up9zun1#

您的数据不符合您想要的结果,您可以更改它
你需要一个动态的方法来解决这个问题

CREATE TABLE table1
    ([Timestamp] DATE, [ID] varchar(1), [Value] int)
;
    
INSERT INTO table1
    ([Timestamp], [ID], [Value])
VALUES
    ('2023-01-18', 'A', 10),
    ('2023-01-19', 'A', 15),
    ('2023-01-20', 'A', 20),
    ('2023-01-18', 'B', 10),
    ('2023-01-19', 'B', 15),
    ('2023-01-20', 'B', 20),
    ('2023-01-18', 'C', 10),
    ('2023-01-19', 'C', 15),
    ('2023-01-20', 'C', 20)
;
9 rows affected
DECLARE 
    @columns NVARCHAR(MAX) = '', 
    @sql     NVARCHAR(MAX) = '';

-- select the Distinct ID
SELECT 
    @columns+=QUOTENAME( [ID]) + ','
FROM 
    (SELECT DISTINCT [ID] FROM table1) t1
ORDER BY 
    [ID];

-- remove the last comma
SET @columns = LEFT(@columns, LEN(@columns) - 1);

-- construct dynamic SQL
SET @sql ='
SELECT * FROM   
(
    SELECT 
       [Timestamp], [ID], [Value]
    FROM 
        table1
) t 
PIVOT(
    MAX([Value])
    FOR [ID] IN ('+ @columns +')
) AS pivot_table;';
--SELECT @sql
-- execute the dynamic SQL
EXECUTE sp_executesql @sql;

| 时间戳|A类|乙|C级|
| - ------|- ------|- ------|- ------|
| 2023年1月18日|十个|十个|十个|
| 2023年1月19日|十五|十五|十五|
| 2023年1月20日|二十个|二十个|二十个|
fiddle

gzjq41n4

gzjq41n42#

以下是传统的轴心方法:

  • 第1步:从单个列中确定应拆分到不同列中的值(您的区分值为"A"、"B"和"C")
  • 第2步:在输出中只希望有一条记录的特定值的字段上进行聚合,在本例中为[Timestamp]
SELECT [Timestamp],
       MAX(CASE WHEN [ID] = 'A' THEN [Value] END) AS A,
       MAX(CASE WHEN [ID] = 'B' THEN [Value] END) AS B,
       MAX(CASE WHEN [ID] = 'C' THEN [Value] END) AS C
FROM tab
GROUP BY [Timestamp]

通常,步骤1需要使用窗口函数,但在本例中,您的[ID]字段已准备好供步骤2使用。
检查here演示。

相关问题