创建查询以在单个结果中返回参数和参数值

时间:2015-10-16 15:17:17

标签: sql sql-server-2008-r2 pivot transpose

如何将以下表格合并/转置为每个客户一条记录,但将参数作为列?

4桌:

  • 公司
  • 属性
  • Company_Attribute
  • Company_Attribute_Values

来源表:

Source Tables

期望的输出:

Output looking for

1 个答案:

答案 0 :(得分: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 |

btw没有意义你有两个表存储相同的数据。 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) |