2015-10-16 45 views
0

如何将下列表格合并/转置为每个客户的一个记录,但将参数设置为列?创建查询以返回单个结果中的参数和参数值

4表:

  • 公司
  • 属性
  • Company_Attribute
  • Company_Attribute_Values

源表:

Source Tables

所需的输出:

Output looking for

+0

你见过支点[** **样品(https://technet.microsoft.com/es-es/library /ms177410(v=sql.105).aspx)? –

+0

对于你的情况,只需将所有4个表加在一起,然后将结果以 –

回答

0

貌似有两个问题加入表和创建PIVOT

我会帮助你的加入

SELECT C.Name, A.Title, CAV.Value 
FROM Company C 
JOIN Company_Attribute_Values CAV 
    ON C.id = CAV.company_id 
JOIN Attribute A 
    ON CAV.attribute_id = A.id 

SQL Fiddle Demo

|  Name |   Title | Value | 
|----------|----------------|----------| 
| ABC Corp |  Currency |  USD | 
| ABC Corp |   Reg No | Reg123 | 
| ABC Corp |   Vat No | Vat5153 | 
| ABC Corp | AccountManager | Mr J Doe | 
| XYZ Corp |  Currency |  EUR | 
| XYZ Corp |   Vat No | VAT654 | 
|  ACME |  Currency |  EUR | 
|  ACME |   Reg No | Reg567 | 
|  ACME |   Vat No | Vat213 | 

顺便说一句没有道理,你有两个表店相同的数据。 Company_AttributeCompany_Attribute_Values相同的表少一个字段。所以只要删除第一个。

PIVOT part

WITH cte as (
    SELECT C.Name, A.Title, CAV.Value 
    FROM Company C 
    JOIN Company_Attribute_Values CAV 
     ON C.id = CAV.company_id 
    JOIN Attribute A 
     ON CAV.attribute_id = A.id 
) 
SELECT name, 
    [Currency], [Reg No], [Vat No], [AccountManager] 
FROM 
    cte 
PIVOT 
(
MAX([Value]) 
FOR Title IN ([Currency], [Reg No], [Vat No], [AccountManager]) 
) AS PivotTable; 

输出

|  name | Currency | Reg No | Vat No | AccountManager | 
|----------|----------|--------|---------|----------------| 
| ABC Corp |  USD | Reg123 | Vat5153 |  Mr J Doe | 
|  ACME |  EUR | Reg567 | Vat213 |   (null) | 
| XYZ Corp |  EUR | (null) | VAT654 |   (null) | 
+0

Thanx作为响应,我可以再问一个问题。属性表是动态的,因此可以在程序中添加新的参数。所以我需要一个动态的参数值列表。同样的表格只是为了说明情况,实际的表格有点复杂。 – Daniel

+0

你可以做同样的动态数据透视http://stackoverflow.com/questions/10404348/sql-server-dynamic-pivot-query –

相关问题