【问题标题】:Simple Pivot sample简单的 Pivot 示例
【发布时间】:2012-08-28 23:36:06
【问题描述】:

我需要所有 masterid 的报告,但它可能只有一个连续的。我知道这是一件简单的事情,但我无法正确理解语法。

我附加了数据在 SQL Server 中的存储方式以及我想要的输出方式。

数据:

所需输出:

CREATE TABLE [dbo].[Services]
    ([ServiceID] [int] IDENTITY(1,1) NOT NULL,
    [MasterID] [nvarchar](10) NOT NULL,
    [Type] [nvarchar](50) NOT NULL,
    [Status] [nvarchar](50) NOT NULL)

Insert Into Services (MasterID, Type , Status) values (123, 'Basic Phone', 'Open')
Insert Into Services (MasterID, Type , Status) values (123, 'BlackBerry', 'Open')
Insert Into Services (MasterID, Type , Status) values (123, 'Pixi', 'Closed')

【问题讨论】:

  • 我不知道 MasterID 如何从 FRIEYIK 更改为 123。您可以发布真实表结构(CREATE TABLE)和真实数据(例如 INSERT)而不是屏幕截图吗?
  • 123 只是一个示例 masterid,我在问题中包含了创建和插入
  • 123和FRIEYIK是什么关系?
  • 没有关系。这只是样本数据。无论如何,我得到了答案。谢谢

标签: sql-server-2008 tsql pivot-table


【解决方案1】:
SELECT MasterID, 
  [Basic Phone] = MAX([Basic Phone]),
  [Pixi] = MAX([Pixi]),
  [Blackberry] = MAX([Blackberry])
FROM
(
  SELECT MasterID, [Basic Phone],[Pixi],[Blackberry]
  FROM dbo.Services AS s
  PIVOT 
  (
    MAX([Status]) FOR [Type] IN ([Basic Phone],[Blackberry],[Pixi])
  ) AS p
) AS x
GROUP BY MasterID;

或者更简单地说——感谢@YS。指出我的冗余。

SELECT MasterID, 
  [Basic Phone],
  [Pixi],
  [Blackberry]
FROM
(
  SELECT MasterID, Status, Type FROM dbo.Services
)
AS s
PIVOT 
(
  MAX([Status]) FOR [Type] IN ([Basic Phone], [Blackberry], [Pixi])
) AS p;

【讨论】:

  • +1 Aaron - 但只是好奇,需要MAX([Basic Phone])..MAX([Blackberry])GROUP BY MasterID 吗?如果是 - 为什么?
  • @YS。因为在这种情况下,枢轴不会折叠成单行。如果你单独对 Q 中的表运行内部查询,你会得到三行而不是一行。
  • 谢谢亚伦。我问这个是因为我的版本和你的有点不同 - 如果你或 OP 有兴趣,我有 sql fiddle:sqlfiddle.com/#!3/cbf94/1
  • 是的。啊,我明白了,我冗余地指定了数据透视列。我会解决的,谢谢。
猜你喜欢
  • 2014-09-18
  • 2013-10-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-14
相关资源
最近更新 更多