Welcome to Sign in | Help

Re: Ajutor optimizare interogare

  •  02-01-2008, 8:52 AM

    Re: Ajutor optimizare interogare

    Dacă te interesează o soluţie pentru SQL 2000, atunci poţi să faci ceva de genul:
    SELECT Produs,
      SUM(CASE WHEN DAY(Data)=1 THEN 1 ELSE 0 END) AS [1],
      SUM(CASE WHEN DAY(Data)=2 THEN 1 ELSE 0 END) AS [2],
      SUM(CASE WHEN DAY(Data)=3 THEN 1 ELSE 0 END) AS [3],
      SUM(CASE WHEN DAY(Data)=4 THEN 1 ELSE 0 END) AS [4],
      SUM(CASE WHEN DAY(Data)=5 THEN 1 ELSE 0 END) AS [5],
      SUM(CASE WHEN DAY(Data)=6 THEN 1 ELSE 0 END) AS Devil,
      SUM(CASE WHEN DAY(Data)=7 THEN 1 ELSE 0 END) AS [7],
      SUM(CASE WHEN DAY(Data)=8 THEN 1 ELSE 0 END) AS Music,
      SUM(CASE WHEN DAY(Data)=9 THEN 1 ELSE 0 END) AS [9],
      SUM(CASE WHEN DAY(Data)=10 THEN 1 ELSE 0 END) AS [10],
      SUM(CASE WHEN DAY(Data)=11 THEN 1 ELSE 0 END) AS [11],
      SUM(CASE WHEN DAY(Data)=12 THEN 1 ELSE 0 END) AS [12],
      SUM(CASE WHEN DAY(Data)=13 THEN 1 ELSE 0 END) AS [13],
      SUM(CASE WHEN DAY(Data)=14 THEN 1 ELSE 0 END) AS [14],
      SUM(CASE WHEN DAY(Data)=15 THEN 1 ELSE 0 END) AS [15],
      SUM(CASE WHEN DAY(Data)=16 THEN 1 ELSE 0 END) AS [16],
      SUM(CASE WHEN DAY(Data)=17 THEN 1 ELSE 0 END) AS [17],
      SUM(CASE WHEN DAY(Data)=18 THEN 1 ELSE 0 END) AS [18],
      SUM(CASE WHEN DAY(Data)=19 THEN 1 ELSE 0 END) AS [19],
      SUM(CASE WHEN DAY(Data)=20 THEN 1 ELSE 0 END) AS [20],
      SUM(CASE WHEN DAY(Data)=21 THEN 1 ELSE 0 END) AS [21],
      SUM(CASE WHEN DAY(Data)=22 THEN 1 ELSE 0 END) AS [22],
      SUM(CASE WHEN DAY(Data)=23 THEN 1 ELSE 0 END) AS [23],
      SUM(CASE WHEN DAY(Data)=24 THEN 1 ELSE 0 END) AS [24],
      SUM(CASE WHEN DAY(Data)=25 THEN 1 ELSE 0 END) AS [25],
      SUM(CASE WHEN DAY(Data)=26 THEN 1 ELSE 0 END) AS [26],
      SUM(CASE WHEN DAY(Data)=27 THEN 1 ELSE 0 END) AS [27],
      SUM(CASE WHEN DAY(Data)=28 THEN 1 ELSE 0 END) AS [28],
      SUM(CASE WHEN DAY(Data)=29 THEN 1 ELSE 0 END) AS [29],
      SUM(CASE WHEN DAY(Data)=30 THEN 1 ELSE 0 END) AS [30],
      SUM(CASE WHEN DAY(Data)=31 THEN 1 ELSE 0 END) AS [31],
      COUNT(*) AS Total
    FROM Facturi f
    INNER JOIN Detail m ON f.ID=m.ID_Factura
    INNER JOIN Produse p ON p.ID=m.ID_Produs
    WHERE Data BETWEEN '20060801' AND '20060831'
    GROUP BY Produs
    ORDER BY Produs


    Dacă ai SQL Server 2005, atunci poţi să foloseşti PIVOT:

    SELECT Produs,
      [1],[2],[3],[4],[5],Devil,[7],Music,[9],[10],[11],[12],[13],[14],[15],[16],[17],[18],[19],[20],[21],[22],[23],[24],[25],[26],[27],[28],[29],[30],[31],
      [1]+[2]+[3]+[4]+[5]+Devil+[7]+Music+[9]+[10]+[11]+[12]+[13]+[14]+[15]+[16]+[17]+[18]+[19]+[20]+[21]+[22]+[23]+[24]+[25]+[26]+[27]+[28]+[29]+[30]+[31] as Total
    FROM (
      SELECT Produs, DAY(Data) AS Ziua
      FROM Facturi f
      INNER JOIN Detail m ON f.ID=m.ID_Factura
      INNER JOIN Produse p ON p.ID=m.ID_Produs
      WHERE Data BETWEEN '20060801' AND '20060831'
    ) AS X PIVOT (COUNT(Ziua) FOR Ziua IN (
      [1],[2],[3],[4],[5],Devil,[7],Music,[9],[10],[11],[12],[13],[14],[15],[16],[17],[18],[19],[20],[21],[22],[23],[24],[25],[26],[27],[28],[29],[30],[31]
    )) AS P
    ORDER BY Produs


    Răzvan

    PS. Evident, semnele alea stupide reprezintă numerele care ar trebui să fie acolo. Nu ştiu cum fac ca să scriu un 6 între paranteze pătrate fără să apară drăcuşorul respectiv...
View Complete Thread
Powered by Community Server (Commercial Edition), by Telligent Systems