T-SQL 查重合并数据并实现动态数据透视

来源:互联网 发布:终结者远程控制软件 编辑:程序博客网 时间:2024/06/16 13:38
  1. /***************************************
  2. 【脚本功能】
  3. (1)去除内容重复的记录,并合并某一级别的业务数据;
  4. (2)对查重合并后的数据集执行数据透视操作。
  5. 【数据源】表名:T1
  6. ID  Owner Resource OrderID Quotation
  7. ------------------------------------
  8. 1   Jack    China   363 45
  9. 2   Jack    China   363 45
  10. 3   Mike    Japan   678 23
  11. 4   Mike    Japan   678 23
  12. 5   Mike    Japan   678 23
  13. 6   John    China   893 12
  14. 7   John    Korea   453 11
  15. 8   Mike    China   234 78
  16. 9   Jack    China   676 33
  17. ****************************************/
  18. --SELECT * FROM T1
  19. --GO


  20. --查重:删除内容(ID除外)重复的代码
  21. SELECT Owner,Resource,SUM(Quotation) AS Total
  22. FROM T1
  23. WHERE ID IN
  24. (
  25. SELECT ID=MIN(ID)FROM T1
  26. GROUP BY Owner,Resource,OrderID,Quotation
  27. )
  28. GROUP BY Owner,Resource
  29. ORDER BY Owner,Resource
  30. GO

  31. /*
  32. 脚本:对查重合并结果集执行数据透视
  33. */
  34. DECLARE @sql nvarchar(1024)
  35. DECLARE @tbTitle nvarchar(256); --透视表的数据分类字段集
  36. --SET @tbTitle  = '[China],[Korea],[Japan]'
  37. SET @tbTitle=''
  38. SELECT @tbTitle=@tbTitle+Resource +','  -- 动态获取透视表分类字段集
  39. FROM
  40. (SELECT DISTINCT Resource FROM T1) AS R

  41. IF @tbTitle <>''
  42. BEGIN
  43.     SET @tbTitle=LEFT(@tbTitle,LEN(@tbTitle)-1) --删除最右边的字段名分隔号
  44.     SET @sql=
  45.     '
  46.     SELECT OWNER AS 客户, '+@tbTitle +
  47.     '
  48.     FROM 
  49.     (
  50.     SELECT Owner,Resource,SUM(Quotation) AS Total
  51.     FROM T1
  52.     WHERE ID IN(
  53.         SELECT ID=MIN(ID)FROM T1
  54.         GROUP BY Owner,Resource,OrderID,Quotation
  55.         )
  56.     GROUP BY Owner,Resource
  57.     ) AS P
  58.     PIVOT
  59.     (
  60.         SUM (Total)
  61.         FOR Resource IN('+@tbTitle+')
  62.     ) AS PVT
  63.     ORDER BY Owner;
  64.     '
  65.     EXEC sp_executesql @sql
  66.     
  67. END
  68. GO

  69. /*
  70. 数据透视的官方范例
  71. USE AdventureWorks2008
  72. GO
  73. SELECT VendorID, [164] AS Emp1, [198] AS Emp2, [223] AS Emp3, [231] AS Emp4, [233] AS Emp5
  74. FROM 
  75. (SELECT PurchaseOrderID, EmployeeID, VendorID
  76. FROM Purchasing.PurchaseOrderHeader) AS p
  77. PIVOT
  78. (
  79. COUNT (PurchaseOrderID)
  80. FOR EmployeeID IN
  81. ( [164], [198], [223], [231], [233] )
  82. ) AS pvt
  83. ORDER BY VendorID;
  84. */
原创粉丝点击