2016-02-23 49 views
1

我想从客户表,合同支出表和合同名称表中选择数据。我的表是这个样子dynamic pivot sql

Customers 
CustomerID CustomerName Address   etc 
1   "ABC Corp" "123 Here Ave" 
2   "Acme Corp" "101 Lets Ave" 

ContractTypes 
ContractTypeID ContractName 
1    "Website Hosting" 
2    "Domain Hosting" 
3    "Email Hosting" 

ServiceSpend 
ServiceSpendID ContractTypeID CustomerID Spend 
1    2    1   5.99 
2    1    1   5.99 
3    1    2   9.99 

我想下表产生

CustomerID CustomerName Address   DomainHosting WebsiteHosting 
1   "ABC Corp" "123 Here Ave" 9.99   5.99 

目前我有工作了下面的SQL语句,但我需要能够动态地定义列,因为我们需要能够额外合约名称添加到数据库和客户仍然报告花

select * 
from 
(
SELECT   
Customers.CustomerID, Customers.ContactName, Customers.Address,        ContractTypes.ContractName AS ContractName, ServiceSpend.Spend 
FROM    
Customers INNER JOIN 
ServiceSpend ON Customers.CustomerID = ServiceSpend.CustomerID 
INNER JOIN 
ContractTypes ON ServiceSpend.ContractTypeID = ContractTypes.ContractTypeID 
) src 
pivot 
(
sum(spend) 
    for ContractName in ([Website Hosting],[Domain Hosting])) piv; 

有谁知道我可以补充我的专栏dynami凯莉

+0

我不认为你需要在这里一个支点,为什么不只是做一组,并使用SUM来的总花场? – Chuck

+0

我该怎么做?是否会为我有的ContractNames列表创建列? – user1711657

+0

回想我的问题,我想我犯了一个错误,我想制作一个这样的表格 '客户ID,客户名称,地址,域名托管,网站托管 1,“ABC Corp”,“123 Here Ave” ,9.99,5.99' – user1711657

回答

1

你必须使用动态SQL构造柱为输出:

DECLARE @Columns VARCHAR(1000) = STUFF((
    SELECT ',[' + ContactName + ']' 
    FROM ContactTypes 
    FOR XML PATH('') 
    ),1,1,'') 
DECLARE @Sql VARCHAR(1000) = ' 
    SELECT * 
    FROM (
     SELECT   
      Customers.CustomerID, 
      Customers.ContactName, 
      Customers.Address, 
      ContractTypes.ContractName, 
      ServiceSpend.Spend 
     FROM Customers 
      INNER JOIN ServiceSpend 
       ON Customers.CustomerID = ServiceSpend.CustomerID 
      INNER JOIN ContractTypes 
       ON ServiceSpend.ContractTypeID = ContractTypes.ContractTypeID 
     ) SRC 
     PIVOT (SUM(Spend) FOR ContractName IN (' + @Columns + ')) piv;' 
EXEC (@Sql) 
+0

** 1)**我个人更喜欢'STUFF(...,1,1,'')'去掉前面的逗号。 ** 2)**因为该列没有名称,所以不需要设置“AS [text()]”列。 –

+0

好点...那是很久以前我被告知这么做的方式,不知道为什么我没有质疑它,因为:)'STUFF'因为很多原因而更好。感谢您的建议@TT –

+0

这很好,谢谢! – user1711657