- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我知道您有多个主题涉及此问题。但是,我还没有找到一个可以满足我的需求的。我需要(按需)将选择的深层表数据转换为宽输出表。其中的问题是我无法将聚合与 Pivot 一起使用,因为它会消耗输出中所需的响应。我已经找到了一个解决方案,但我认为这不是最好的,因为它需要无数的左连接才能工作。我已将所有尝试和注释包含在内,如下所示:
-- Sql Server 2008 db.-- Deep table structure (not subject to modification) contains name/value pairs with a userId as-- foreign key. In many cases there can be MORE THAN ONE itemValue given by the user for the-- itemName such as if asked their race, can answer White + Hispanic, etc. Each response is stored-- as a seperate record - this cannot currently be changed.-- Goal: pivot deep data to wide while also compressing result -- set down. Account for all items per userId, and duplicating-- column values (rather than show nulls) as applicable-- Sample table to store some data of both single and multiple responsesDECLARE @testTable AS TABLE(userId int, itemName varchar(50), itemValue varchar(255))INSERT INTO @testTableSELECT 1, 'q01', '1-q01 Answer'UNION SELECT 1, 'q02', '1-q02 Answer'UNION SELECT 1, 'q03', '1-q03 Answer 1'UNION SELECT 1, 'q03', '1-q03 Answer 2'UNION SELECT 1, 'q03', '1-q03 Answer 3'UNION SELECT 1, 'q04', '1-q04 Answer'UNION SELECT 1, 'q05', '1-q05 Answer'UNION SELECT 2, 'q01', '2-q01 Answer'UNION SELECT 2, 'q02', '2-q02 Answer'UNION SELECT 2, 'q03', '2-q03 Answer 1'UNION SELECT 2, 'q03', '2-q03 Answer 2'UNION SELECT 2, 'q04', '2-q04 Answer'UNION SELECT 2, 'q05', '2-q05 Answer'SELECT 'Raw Data'SELECT * FROM @TestTableSELECT 'Using Pivot - shows aggregate result of itemValue per itemName - eats others'; WITH Data AS ( SELECT [userId] , [itemName] , [itemValue] FROM @testTable)SELECT [userId] , [q02] , [q03] , [q05]FROM DataPIVOT( MIN(itemValue) -- Aggregate function eats needed values. FOR itemName in ([q02], [q03], [q05])) AS PivotTableSELECT 'Aggregate with Grouping - Causes Null Values'SELECT DISTINCT userId ,[q02] = Max(CASE WHEN itemName = 'q02' THEN itemValue END) ,[q03] = Max(CASE WHEN itemName = 'q03' THEN itemValue END) ,[q05] = Max(CASE WHEN itemName = 'q05' THEN itemValue END)FROM @testTableWHERE itemName in ('q02', 'q03', 'q05') -- Makes it a hair quickerGROUP BY userId -- If by userId only, it only gives 1 row PERIOD = BAD!! , [itemName] , [itemValue]SELECT 'Multiple Left Joins - works properly but bad if pivoting 175 columns or so'; WITH Data AS ( SELECT userId ,[itemName] ,[itemValue] FROM @testTable WHERE itemName in ('q02', 'q03', 'q05') -- Makes it a hair quicker)SELECT DISTINCT s1.userId ,[q02] = s2.[itemValue] ,[q03] = s3.[itemValue] ,[q05] = s5.[itemValue]FROM Data s1 LEFT JOIN Data s2 ON s2.userId = s1.userId AND s2.[itemName] = 'q02' LEFT JOIN Data s3 ON s3.userId = s1.userId AND s3.[itemName] = 'q03' LEFT JOIN Data s5 ON s5.userId = s1.userId AND s5.[itemName] = 'q05'
因此,底部查询是唯一一个(到目前为止)可以完成我需要它做的事情,但是当我使用实际项目名称进行透视时,LEFT JOIN 将失控并导致性能问题。如有任何建议,我们将不胜感激。
最佳答案
我认为您必须坚持使用联接,因为联接正是产生您想要的结果的方式。连接的目的是将行集组合在一起(有条件或无条件),并且您的目标输出只不过是行子集的组合。
但是,如果大多数问题始终只有单一答案,则可以大大减少必要的联接数量。这个想法是仅将多个响应组作为单独的行集连接起来。对于单响应项目,它们仅作为目标项目整个数据集的一部分进行连接。
一个例子应该可以更好地说明我可能无法口头描述的内容。假设源数据中有两个潜在的多重响应组,'q03'
和'q06'
(实际上,这是源表:
DECLARE @testTable AS TABLE(
userId int,
itemName varchar(50),
itemValue varchar(255)
);
INSERT INTO @testTable
SELECT 1, 'q01', '1-q01 Answer'
UNION SELECT 1, 'q02', '1-q02 Answer'
UNION SELECT 1, 'q03', '1-q03 Answer 1'
UNION SELECT 1, 'q03', '1-q03 Answer 2'
UNION SELECT 1, 'q03', '1-q03 Answer 3'
UNION SELECT 1, 'q04', '1-q04 Answer'
UNION SELECT 1, 'q05', '1-q05 Answer'
UNION SELECT 1, 'q06', '1-q06 Answer 1'
UNION SELECT 1, 'q06', '1-q06 Answer 2'
UNION SELECT 1, 'q06', '1-q06 Answer 3'
UNION SELECT 2, 'q01', '2-q01 Answer'
UNION SELECT 2, 'q02', '2-q02 Answer'
UNION SELECT 2, 'q03', '2-q03 Answer 1'
UNION SELECT 2, 'q03', '2-q03 Answer 2'
UNION SELECT 2, 'q04', '2-q04 Answer'
UNION SELECT 2, 'q05', '2-q05 Answer'
UNION SELECT 2, 'q06', '2-q06 Answer 1'
UNION SELECT 2, 'q06', '2-q06 Answer 2'
;
与原始帖子中的表格相同,但添加了 'q06'
项),生成的脚本可能如下所示:
WITH ranked AS (
SELECT
*,
rn = ROW_NUMBER() OVER (PARTITION BY userId, itemName ORDER BY itemValue)
FROM @testTable
),
multiplied AS (
SELECT
r.userId,
r.itemName,
r.itemValue,
rn03 = r03.rn,
rn06 = r06.rn
FROM ranked r03
INNER JOIN ranked r06 ON r03.userId = r06.userId AND r06.itemName = 'q06'
INNER JOIN ranked r ON r03.userId = r.userId AND (
r.itemName = 'q03' AND r.rn = r03.rn OR
r.itemName = 'q06' AND r.rn = r06.rn OR
r.itemName NOT IN ('q03', 'q06')
)
WHERE r03.itemName = 'q03'
AND r.itemName IN ('q02', 'q03', 'q05', 'q06')
)
SELECT userId, rn03, rn06, q02, q03, q05, q06
FROM multiplied
PIVOT (
MIN(itemValue)
FOR itemName in (q02, q03, q05, q06)
) AS PivotTable
关于Sql Server 2008 - 不带聚合功能的 PIVOT,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7854553/
我有一个 todolist 应用程序,它在 Pivot 控件内的单独 PivotItems 中具有多个 ListBox 控件。如果我导航到另一个页面,然后使用后退按钮返回,则显示的 Pivot 没有响
我想 pivot_long() 下面数据集的多列避免硬编码。我看过一些类似的问题,但我仍然做不到。 宽数据: > head(data) ID IND_TEST_SCORE ARG_G1_A
假设我有一个 orders 表,它将与另外三个名为 typings、translates 和 论文 。我知道数据透视表应该有点像 many to many polymorphic relation但这
当我尝试将 null 替换为 zero 时,收到以下错误消息。 The column name "jan" specified in the PIVOT operator conflicts with
有没有办法在数据透视表中为计算为零的单元格隐藏或显示空白单元格? 最佳答案 使用数字格式隐藏所选单元格中的零值: 按照此过程隐藏所选单元格中的零值。如果其中一个单元格中的值更改为非零值,则该值的格式将
我正在尝试理解 Select algorithm我遇到了 a good pivot VS a bad pivot 。我可以看到该算法正在使用 Partition 算法来分隔右侧的较大元素pivot 和
我有以下代码:
我有一个国家表和一个数据透视表 Country_language,其中列出了所有国家及其可用语言的翻译。 表结构如下: Languages -------------- ID Locale Recor
目前,PWS 上唯一的 RabbitMQ 服务看起来有点不确定。我想知道我是否可以使用 Pivotals 解决方案 https://network.pivotal.io/products/p-redi
我是使用 Spark 数据帧的新手。我正在尝试将 pivot 方法与 Spark(Spark 版本 2.x)一起使用并遇到以下错误: Py4JError: An error occurred whil
我需要转置一个表,其中 column1 是实体的名称,column2 到 column366 是一年中包含美元金额的日期。表,select语句,输出结果都给了 以下 - 问题 - 此语法要求我创建一个
我想知道是否可以像在 python 和 R 上那样在 OpenRefine 上创建值的聚合和汇总?示例: 包含 30 万条记录的医疗预约表身份识别患者 |年龄 |身份证预约 |值 患者汇总和总结的结果
我想知道是否可以像在 python 和 R 上那样在 OpenRefine 上创建值的聚合和汇总?示例: 包含 30 万条记录的医疗预约表身份识别患者 |年龄 |身份证预约 |值 患者汇总和总结的结果
我不熟悉 SQL 并使用 Google BigQuery。我有一个表,其中有一条记录如下所示: publication_number |受让人 US-6044964-A|索尼公司 |数字音频光盘公司
在尝试转换 sql 表时,我看到了这篇文章 Here .通过使用这种方法,我创建了一个查询。但是我现在已经意识到它当然会使用 MAX 函数聚合结果。但是,我需要 Colum 旋转,但要显示所有事件。从
我们能否将行旋转到多列,即 Create table #Temp_Trans ( P_ID int, Custom_Name varchar(30), Text_Value var
计算字段很棒,但有一些限制,例如无法对其进行排序(无法将字段移动到报告过滤器区域)。 我试过“强制”一个过滤器,就像微软的人建议的那样:https://answers.microsoft.com/en
我有以下数据集,我需要从中计算数据透视中不同值的计数。我尝试了几个函数,如 FREQUENCY、COUNTIFS 等,但我做不到。 输入 Input Data 输出 Expected Output 最
请看下面的数据: 我正在寻找生成以下输出的查询: 我正在试验“PIVOT”,但尚未取得预期的结果。 最佳答案 这应该有效: SELECT ReviewType, DER, LEI, NOR, [NOT
我有两个表Person(person_id, name) 和另一个表Contacts(person_id, phone_type, phone_no)。 Person-----------------
我是一名优秀的程序员,十分优秀!