是否可以按表格中的元素(如COLUMN LIKE='Value%'
)分组PIVOT
?我有一个表 [DBT].[Status] 包含各种状态(数据库、实例等),并且不想将所有 PROD 和 TEST 值作为单个值进行透视/查询,而是将它们分组。
例如,我将只有一列包含 和 的值,而不是列用于状态Prod
、Prod ACC
、 、 ..等。Prod APP
Name LIKE 'Prod%'
Name LIKE 'Test%'
到目前为止我所拥有的:
表定义
CREATE TABLE [DBT].[Status](
[ID] [int] IDENTITY(1,1) NOT NULL,
[Name] [nvarchar](50) NOT NULL,
CONSTRAINT [PK_Status] PRIMARY KEY CLUSTERED
(
[ID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, FILLFACTOR = 80) ON [PRIMARY],
CONSTRAINT [IX_Status] UNIQUE NONCLUSTERED
(
[Name] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, FILLFACTOR = 80) ON [PRIMARY]
) ON [PRIMARY]
GO
表值
INSERT INTO [DBT].[Status]
(
-- ID -- this column value is auto-generated
Name
)
VALUES
('Test ACC'),
('Test APP'),
('Test DBA'),
('Prod ACC'),
('Prod APP'),
('Prod DBA'),
('Prod'),
('Test'),
('Migrated'),
('Offline'),
('Reserved')
透视状态表
SELECT 'Database Status' AS [DB Status],
[1] AS [Test ACC], [2] AS [Test APP], [3] AS [Test DBA], [4] AS [Prod ACC], [5] AS [Prod APP], [6] AS [Prod DBA], [7] AS [Prod], [8] AS [Test], [9] AS [Migrated], [10] AS [Offline], [11] AS [Reserved]
FROM
(
SELECT ID, Name FROM [DBT].[Status]
) AS Source
PIVOT
(
COUNT(Name) FOR ID IN ([1], [2], [3], [4], [5], [6], [7], [8], [9], [10], [11])
) AS PivotTable
到目前为止的输出
DB Status Test ACC Test APP Test DBA Prod ACC Prod APP Prod DBA Prod Test Migrated Offline Reserved
--------------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- -----------
Database Status 1 1 1 1 1 1 1 1 1 1 1
db<>小提琴
到目前为止的dbfiddle 。
问题
我宁愿将它们分组,而不是为各种Test...
和值设置多行,类似于以下内容:Prod....
DB Status | Test | Prod | Migrated | Offline | Reserved
--------------- | ---- | ---- | -------- | ------- | --------
Database Status | 4 | 4 | 1 | 1 | 1
我不知道如何解决我的问题。(老实说,经过大量的反复试验,我昨天才掌握了 PIVOT)。
这个问题与我已经问过的如何在多个表上创建分组项目的总和/计数问题松散相关。表 [DBT].[Instance] 和 [DBT].[Database] 包含一个具有 [StatusID] 的列,它对应于我们现在正在查看的表。
总和(案例
对于有限数量的名称,您可以通过这种方式使用 SUM(CASE 解决方案:
枢
如果有一个广泛的名称列表,但只有少数必须重写,您可以维护 PIVOT 解决方案:
db<>在这里摆弄
动态查询
如果你觉得有点懒,不想写所有列名,可以使用动态查询:
db<>在这里摆弄
我认为在这里严格区分您尝试一步执行的两项任务很重要。
为了对数据进行分类,我的直觉是推荐一个查找表来将记录严格映射到父类。例如
StatusType
...其中(默认ID
为 =1 )中的种子记录Status.StatusTypeID
是名为“未知”或类似名称的占位符记录。当查找数据播种并使用正确的键更新基本记录时,您可以转向您心中的内容。
完整的 dbfiddle