sql >> Databáze >  >> RDS >> Sqlserver

Nelze kontingenční tabulku s mým dotazem?

Abychom rozšířili další odpovědi, funkce PIVOT vyžaduje určitý typ agregace. Protože hodnota, kterou chcete převést z řádku na sloupec, je řetězec, můžete použít buď max() nebo min() agregační funkce.

Zatímco @Muhammed Ali's odpověď bude fungovat, když budete mít jeden AttributeName /AttributeValue pár, pokud máte pro každý ID více párů , pak vrátíte pouze buď max nebo min hodnota.

Pokud jsou například vaše ukázková data:

INSERT INTO @MyTable VALUES ('A1', 'Atr1', 'A1V1');
INSERT INTO @MyTable VALUES ('A1', 'Atr1', 'A1V4');
INSERT INTO @MyTable VALUES ('A1', 'Atr2', 'A1V2');
INSERT INTO @MyTable VALUES ('A1', 'Atr3', 'A1V3');
INSERT INTO @MyTable VALUES ('A2', 'Atr1', 'A2V1');
INSERT INTO @MyTable VALUES ('A2', 'Atr2', 'A2V2');
INSERT INTO @MyTable VALUES ('A2', 'Atr3', 'A3V3');

I když máte více řádků pro kombinaci A1 a Atr1 , ostatní dotazy vracejí pouze max(attributevalue) :

| ID | ATR1 | ATR2 | ATR3 |
|----|------|------|------|
| A1 | A1V4 | A1V2 | A1V3 |
| A2 | A2V1 | A2V2 | A3V3 |

Hádal bych, že byste vlastně chtěli vrátit všechny kombinace. Navrhuji rozšířit váš dotaz tak, aby zahrnoval funkci okna row_number() ve vašem dotazu. Tento dotaz vygeneruje jedinečnou hodnotu, která bude poté zahrnuta do seskupovacího aspektu PIVOT a umožní vám vrátit více než jeden řádek pro každé ID.

Přidáním row_number() , bude dotaz podobný následujícímu:

SELECT Id, [Atr1], [Atr2],[Atr3]
FROM
( 
  SELECT ID, AttributeName, AttributeValue,
    row_number() over(partition by id, attributename
                      order by attributevalue) seq
  FROM @MyTable
) AS SourceTable 
PIVOT 
(
    max(AttributeValue)
    FOR AttributeName IN ([ATR1], [ATR2], [ATR3])
) AS pvt
order by id;

Viz SQL Fiddle s ukázkou . Získáte výsledek, který vrátí všechny řádky:

| ID | ATR1 |   ATR2 |   ATR3 |
|----|------|--------|--------|
| A1 | A1V1 |   A1V2 |   A1V3 |
| A1 | A1V4 | (null) | (null) |
| A2 | A2V1 |   A2V2 |   A3V3 |

Pokud máte potíže s pochopením konceptu PIVOT, pak bych navrhl, abyste se k výsledku podívali pomocí kombinace agregační funkce s výrazem CASE. Poté můžete vidět seskupení sekvence/id:

SELECT Id, 
  max(case when attributename = 'Atr1' then attributevalue end) Atr1,
  max(case when attributename = 'Atr2' then attributevalue end) Atr2,
  max(case when attributename = 'Atr3' then attributevalue end) Atr3
FROM
( 
  SELECT ID, AttributeName, AttributeValue,
    row_number() over(partition by id, attributename
                      order by attributevalue) seq
  FROM @MyTable
) AS SourceTable 
group by id, seq

Viz SQL Fiddle s ukázkou



  1. Získejte neoznačená data z db

  2. přidat dočasný sloupec s hodnotou

  3. Vyřešte matematické funkce PL/SQL

  4. Symfony2:vytváří fetch=EAGER spojení?