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

Dynamické sloupce - SQL Server - Měsíce jako sloupce

Vaše data jsou již převedena, ale je třeba je přesunout na jinou úroveň. Myslím, že nejlepším způsobem, jak to zvládnout, je nejprve to uvolnit a poté zpracovat správnou úroveň otáčení.

Krok 1:Odklopení

Můžete použít SQL 2005 UNPIVOT nebo použijte techniku ​​CROSS JOIN. Zde jsou příklady obojího. Všimněte si, že jsem uprostřed vynechal měsíce, aby byly věci jednoduché. Stačí je přidat.

-- CROSS JOIN method (also works in SQL 2000)
SELECT
   P.Project,
   Mo =
      DateAdd(mm,
         X.MonthNum,
         DateAdd(yy, P.[Year] - 1900, '19000101')
      ),
   Amount = 
      CASE X.MonthNum
         WHEN 0 THEN Jan
         WHEN 1 THEN Feb
         WHEN 11 THEN Dec
      END
FROM
   ProjectData P
   CROSS JOIN (
      SELECT 0 UNION ALL SELECT 1 UNION ALL SELECT 11
   ) X (MonthNum)

Každý řádek se opakuje 12krát, pak příkaz CASE vytáhne pro každý řádek pouze jeden měsíc, takže data zůstanou pěkně neotočná.

-- UNPIVOT method
SELECT
    P.Project,
    Mo =
       DateAdd(mm,
          Convert(int, P.MonthNum),
          DateAdd(yy, P.[Year] - 1900, '19000101')
       ),
    P.Amount
FROM
   (
      SELECT Project, [Year], [0] = Jan, [1] = Feb, [11] = Dec
      FROM ProjectData
   ) X UNPIVOT (Amount FOR MonthNum IN ([0], [1], [11])) P

DROP TABLE ProjectData

Ani jedna metoda není vždy jasným vítězem výkonu. Někdy jeden funguje lépe než druhý (v závislosti na pivotovaných datech). Metoda UNPIVOT používá v plánu provádění filtr, který CROSS JOIN nepoužívá.

Krok 2:Znovu otočte

Nyní, jak používat unpivoted data. Neřekli jste, jak váš někdo bude to spotřebovávat, ale protože budete muset vložit data do nějakého výstupního souboru, navrhuji použít SSRS (Sql Server Reporting Services), který je dodáván s SQL Server 2005 bez dalších poplatků.

Stačí použít Matrix objekt reportu pro pivotování jednoho z výše uvedených dotazů. Tento objekt šťastně určuje datové hodnoty, které se mají převést do popisků sloupců za běhu sestavy, a zní jako přesně to, co potřebujete. Pokud přidáte sloupec, který formátuje datum přesně tak, jak chcete, můžete seřadit podle sloupce Mo, ale jako popisek sloupce použijte nový výraz.

SSRS má také k dispozici širokou škálu formátů a možností plánování. Můžete jej například nechat poslat e-mailem soubor aplikace Excel nebo uložit webovou stránku do sdíleného souboru.

Pokud jsem něco vynechal, dejte mi prosím vědět.

Pro každého, kdo by chtěl vidět výše uvedený kód v akci, je zde pro vás nějaký skript pro vytvoření:

USE tempdb

CREATE TABLE ProjectData (
    Project varchar(10),
    [Year] int,
    Jan decimal(15, 2),
    Feb decimal(15, 2),
    Dec decimal(15, 2)
)

SET NOCOUNT ON

INSERT ProjectData VALUES ('11-11079', 2008, 0.0, 0.0, 75244.90)
INSERT ProjectData VALUES ('11-11079', 2009, 466.0, 0.0, 0.0)
INSERT ProjectData VALUES ('11-11079', 2010, 855.0, 0.0, 0.0)
INSERT ProjectData VALUES ('01-11052', 2009, 56131.0, 0.0, 0.0)


  1. dílčí řetězec v oracle

  2. Java mySQL s 000webhostingem

  3. Jak obnovit databázi mysql v XAMPP?

  4. PHP MySQL INSERT vrátí hodnotu s jedním provedením dotazu