好贷网好贷款

sql 查询 20maxuyang1987]

发布时间:2016-12-5 10:26:23 编辑:www.fx114.net 分享查询网我要评论
本篇文章主要介绍了"sql 查询 20maxuyang1987]",主要涉及到sql 查询 20maxuyang1987]方面的内容,对于sql 查询 20maxuyang1987]感兴趣的同学可以参考一下。

T1表内有如下三下字段      字段            类型              备注    date            datetime          时间    field           Varchar           地区    number          int               数量 -----------生成表 USE [Test] GO /****** 对象:  Table [dbo].[T1]    脚本日期: 04/13/2010 17:54:38 ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO SET ANSI_PADDING ON GO CREATE TABLE [dbo].[T1]( [date] [datetime] NOT NULL, [field] [varchar](50) COLLATE Chinese_PRC_CI_AS NOT NULL, [number] [int] NOT NULL ) ON [PRIMARY] GO SET ANSI_PADDING OFF ---------测试数据 insert into t1 values('2008-9-10','江苏',12) insert into t1 values('2008-9-10','山东',22) insert into t1 values('2008-9-10','湖南',10) insert into t1 values('2008-9-10','云南',12) insert into t1 values('2008-10-1','江苏',32) insert into t1 values('2008-10-1','山东',12) insert into t1 values('2008-10-1','湖南',12) insert into t1 values('2008-10-1','云南',24) insert into t1 values('2008-12-1','江苏',8) insert into t1 values('2008-12-1','山东',15) insert into t1 values('2008-12-1','湖南',20) insert into t1 values('2008-12-1','云南',24)  -------------------------------------- 怎样写sql将如下显示出来 date        field1          field2        field3        field4

一个省一列吗?

你是指行转列吗? create table #TABLE (Area varchar(10), Date varchar(10), Count int) go insert into #TABLE (Area, Date, Count) values ('BeiJing', '2007-01-01',100000) insert into #TABLE (Area, Date, Count) values ('GuangZhou', '2007-01-01',200000) insert into #TABLE (Area, Date, Count) values ('BeiJing','2007-02-19',300000) insert into #TABLE (Area, Date, Count) values ('GuangZhou','2007-02-19',400000) insert into #TABLE (Area, Date, Count) values ('BeiJing','2007-03-21',500000) insert into #TABLE (Area, Date, Count) values ('GuangZhou','2007-03-21',600000) go --sql2000 SELECT Area,  '2007-01-01'=SUM(CASE Date WHEN '2007-01-01'  THEN [Count] END),   '2007-02-19'=SUM(CASE Date WHEN '2007-02-19'  THEN [Count] END),   '2007-03-21'=SUM(CASE Date WHEN '2007-03-21'  THEN [Count] END) FROM #table  GROUP BY Area go --sql2005 SELECT *  FROM  #TABLE PIVOT(SUM([Count]) FOR Date IN (  [2007-01-01],[2007-02-19],[2007-03-21])) b

IF OBJECT_ID('[T1]') IS NOT NULL DROP TABLE [T1] GO CREATE TABLE [dbo].[T1]( [date] [datetime] NOT NULL, [field] [varchar](50) COLLATE Chinese_PRC_CI_AS NOT NULL, [number] [int] NOT NULL ) ON [PRIMARY] insert into t1 values('2008-9-10','江苏',12) insert into t1 values('2008-9-10','山东',22) insert into t1 values('2008-9-10','湖南',10) insert into t1 values('2008-9-10','云南',12) insert into t1 values('2008-10-1','江苏',32) insert into t1 values('2008-10-1','山东',12) insert into t1 values('2008-10-1','湖南',12) insert into t1 values('2008-10-1','云南',24) insert into t1 values('2008-12-1','江苏',8) insert into t1 values('2008-12-1','山东',15) insert into t1 values('2008-12-1','湖南',20) insert into t1 values('2008-12-1','云南',24) declare @s varchar(8000) select @s=ISNULL(@s,'select convert(varchar(10),date,23) date')          +',sum(case field when '''+field+''' then number else 0 end)['+field+']' from T1 group by field exec(@s+' from t1 group by convert(varchar(10),date,23)') /* date       湖南          江苏          山东          云南 ---------- ----------- ----------- ----------- ----------- 2008-09-10 10          12          22          12 2008-10-01 12          32          12          24 2008-12-01 20          8           15          24 (3 行受影响) */

IF OBJECT_ID('[T1]') IS NOT NULL DROP TABLE [T1] GO CREATE TABLE [dbo].[T1]( [date] [datetime] NOT NULL, [field] [varchar](50) COLLATE Chinese_PRC_CI_AS NOT NULL, [number] [int] NOT NULL ) ON [PRIMARY] insert into t1 values('2008-9-10','江苏',12) insert into t1 values('2008-9-10','山东',22) insert into t1 values('2008-9-10','湖南',10) insert into t1 values('2008-9-10','云南',12) insert into t1 values('2008-10-1','江苏',32) insert into t1 values('2008-10-1','山东',12) insert into t1 values('2008-10-1','湖南',12) insert into t1 values('2008-10-1','云南',24) insert into t1 values('2008-12-1','江苏',8) insert into t1 values('2008-12-1','山东',15) insert into t1 values('2008-12-1','湖南',20) insert into t1 values('2008-12-1','云南',24) --2005 declare @s varchar(8000) select @s=ISNULL(@s+',','')+field from T1 group by field exec('select * from (select convert(varchar,date,23) date,field,number from t1) t pivot(sum(number) for field in([email protected]+'))b') /* date       湖南          江苏          山东          云南 ---------- ----------- ----------- ----------- ----------- 2008-09-10 10          12          22          12 2008-10-01 12          32          12          24 2008-12-01 20          8           15          24 (3 行受影响) */

htl258 能不能说一下pivot用法

使用 PIVOT 和 UNPIVOT  发送反馈    请参阅    全部折叠全部展开 语言筛选器: 全部语言筛选器: 多个语言筛选器: Visual Basic语言筛选器: C#语言筛选器: C++语言筛选器: J#语言筛选器: JScript  访问和更改数据库数据 > 查询基础知识 > 使用 FROM 子句 >    Visual Basic(Declaration)   C#  C++  J#  JScript 可以使用 PIVOT 和 UNPIVOT 关系运算符将表值表达式更改为另一个表。PIVOT 通过将表达式某一列中的唯一值转换为输出中的多个列来旋转表值表达式,并在必要时对最终输出中所需的任何其余列值执行聚合。UNPIVOT 与 PIVOT 执行相反的操作,将表值表达式的列转换为列值。 注意:  对升级到 SQL Server 2005 或更高版本的数据库使用 PIVOT 和 UNPIVOT 时,必须将数据库的兼容级别设置为 90 或更高。有关如何设置数据库兼容级别的信息,请参阅 sp_dbcmptlevel (Transact-SQL)。   PIVOT 提供的语法比一系列复杂的 SELECT...CASE 语句中所指定的语法更简单和更具可读性。有关 PIVOT 语法的完整说明,请参阅 FROM (Transact-SQL)。 以下是带批注的 PIVOT 语法。 SELECT <non-pivoted column>,      [first pivoted column] AS <column name>,      [second pivoted column] AS <column name>,      ...      [last pivoted column] AS <column name>  FROM      (<SELECT query that produces the data>)      AS <alias for the source query> PIVOT  (      <aggregation function>(<column being aggregated>)  FOR  [<column that contains the values that will become column headers>]      IN ( [first pivoted column], [second pivoted column],      ... [last pivoted column])  ) AS <alias for the pivot table>  <optional ORDER BY clause>;  简单 PIVOT 示例 下面的代码示例生成一个两列四行的表。  复制代码  USE AdventureWorks ; GO SELECT DaysToManufacture, AVG(StandardCost) AS AverageCost  FROM Production.Product GROUP BY DaysToManufacture;   下面是结果集:  DaysToManufacture          AverageCost  0                          5.0885  1                          223.88  2                          359.1082  4                          949.4105  没有定义 DaysToManufacture 为 3 的产品。 以下代码显示相同的结果,该结果经过透视以使 DaysToManufacture 值成为列标题。提供一个列表示三 [3] 天,即使结果为 NULL。  复制代码  -- Pivot table with one row and five columns SELECT 'AverageCost' AS Cost_Sorted_By_Production_Days,  [0], [1], [2], [3], [4] FROM (SELECT DaysToManufacture, StandardCost      FROM Production.Product) AS SourceTable PIVOT ( AVG(StandardCost) FOR DaysToManufacture IN ([0], [1], [2], [3], [4]) ) AS PivotTable;   下面是结果集:  Cost_Sorted_By_Production_Days    0         1         2           3       4         AverageCost                       5.0885    223.88    359.1082    NULL    949.4105  复杂 PIVOT 示例 可能会用到 PIVOT 的常见情况是:需要生成交叉表格报表以汇总数据。例如,假设需要在 AdventureWorks 示例数据库中查询 PurchaseOrderHeader 表以确定由某些特定雇员所下的采购订单数。以下查询提供了此报表(按供应商排序)。  复制代码  USE AdventureWorks; GO SELECT VendorID, [164] AS Emp1, [198] AS Emp2, [223] AS Emp3, [231] AS Emp4, [233] AS Emp5 FROM  (SELECT PurchaseOrderID, EmployeeID, VendorID FROM Purchasing.PurchaseOrderHeader) p PIVOT ( COUNT (PurchaseOrderID) FOR EmployeeID IN ( [164], [198], [223], [231], [233] ) ) AS pvt ORDER BY pvt.VendorID;   以下为部分结果集。  复制代码  VendorID    Emp1        Emp2        Emp3        Emp4        Emp5 1           4           3           5           4           4 2           4           1           5           5           5 3           4           3           5           4           4 4           4           2           5           5           4 5           5           1           5           5           5   将在 EmployeeID 列上透视此嵌套 select 语句返回的结果。  复制代码  SELECT PurchaseOrderID, EmployeeID, VendorID FROM PurchaseOrderHeader;   这意味着 EmployeeID 列返回的唯一值自行变成了最终结果集中的字段。结果,在透视子句中指定的每个 EmployeeID 号都有相应的一列:在本例中为雇员 164、198、223、231 和 233。PurchaseOrderID 列作为值列,将根据此列对最终输出中返回的列(称为分组列)进行分组。在本例中,通过 COUNT 函数聚合分组列。请注意,将显示一条警告消息,指出为每个雇员计算 COUNT 时未考虑显示在 PurchaseOrderID 列中的任何空值。 重要提示:  如果聚合函数与 PIVOT 一起使用,则计算聚合时将不考虑出现在值列中的任何空值。   UNPIVOT 将与 PIVOT 执行几乎完全相反的操作,将列转换为行。假设以上示例中生成的表在数据库中存储为 pvt,并且您需要将列标识符 Emp1、Emp2、Emp3、Emp4 和 Emp5 旋转为对应于特定供应商的行值。这意味着必须标识另外两个列。包含要旋转的列值(Emp1、Emp2...)的列将被称为 Employee,将保存当前位于待旋转列下的值的列被称为 Orders。这些列分别对应于 Transact-SQL 定义中的 pivot_column 和 value_column。以下为该查询。  复制代码  --Create the table and insert values as portrayed in the previous example. CREATE TABLE pvt (VendorID int, Emp1 int, Emp2 int,     Emp3 int, Emp4 int, Emp5 int); GO INSERT INTO pvt VALUES (1,4,3,5,4,4); INSERT INTO pvt VALUES (2,4,1,5,5,5); INSERT INTO pvt VALUES (3,4,3,5,4,4); INSERT INTO pvt VALUES (4,4,2,5,5,4); INSERT INTO pvt VALUES (5,5,1,5,5,5); GO --Unpivot the table. SELECT VendorID, Employee, Orders FROM     (SELECT VendorID, Emp1, Emp2, Emp3, Emp4, Emp5    FROM pvt) p UNPIVOT    (Orders FOR Employee IN        (Emp1, Emp2, Emp3, Emp4, Emp5) )AS unpvt; GO   以下为部分结果集。  复制代码  VendorID   Employee   Orders 1      Emp1         4 1      Emp2         3 1      Emp3         5 1      Emp4         4 1      Emp5         4 2      Emp1         4 2      Emp2         1 2      Emp3         5 2      Emp4         5 2      Emp5         5 ...   请注意,UNPIVOT 并不完全是 PIVOT 的逆操作。PIVOT 会执行一次聚合,从而将多个可能的行合并为输出中的单个行。而 UNPIVOT 不会重现原始表值表达式的结果,因为行已经被合并了。另外,UNPIVOT 的输入中的空值不会显示在输出中,而在执行 PIVOT 操作之前,输入中可能有原始的空值。 AdventureWorks 示例数据库中的 Sales.vSalesPersonSalesByFiscalYears 视图将使用 PIVOT 返回每个销售人员在每个会计年度的总销售额。若要在 SQL Server Management Studio 中编写视图脚本,请在对象资源管理器中,在“视图”文件夹下找到 AdventureWorks 数据库对应的视图。右键单击该视图名称,再选择“编写视图脚本为”。

联机帮助看起来比较累,看例子吧,更容易理解:http://blog.csdn.net/htl258/archive/2009/08/20/4467882.aspx

非常感谢!!!!

上一篇:BI SQL 2008 压缩 100lcw321321]
下一篇:[推荐] 【SQL SERVER 2005页面存储2之--特殊数据类型在页面中的存储】 100feixianxxx]

相关文章

相关评论