sql >> データベース >  >> RDS >> Sqlserver

複数のPIVOTS? 1か月あたりの時間で数える必要があります

    それを行う1つの方法

    WITH hour_list AS (
      SELECT 0 hour
      UNION ALL
      SELECT hour + 1 FROM hour_list WHERE hour < 23
    )
    SELECT h.hour,
           COALESCE(jan, 0) jan,
           COALESCE(feb, 0) feb,
           COALESCE(mar, 0) mar,
           COALESCE(apr, 0) apr,
           COALESCE(may, 0) may,
           COALESCE(jun, 0) jun,
           COALESCE(jul, 0) jul,
           COALESCE(aug, 0) aug,
           COALESCE(sep, 0) sep,
           COALESCE(oct, 0) oct,
           COALESCE(nov, 0) nov,
           COALESCE(dec, 0) dec
      FROM hour_list h LEFT JOIN
    (
      SELECT DATEPART(HOUR, logtime) hour, 
             SUM(CASE WHEN DATEPART(MONTH, logtime) =  1 THEN 1 END) jan,
             SUM(CASE WHEN DATEPART(MONTH, logtime) =  2 THEN 1 END) feb,
             SUM(CASE WHEN DATEPART(MONTH, logtime) =  3 THEN 1 END) mar,
             SUM(CASE WHEN DATEPART(MONTH, logtime) =  4 THEN 1 END) apr,
             SUM(CASE WHEN DATEPART(MONTH, logtime) =  5 THEN 1 END) may,
             SUM(CASE WHEN DATEPART(MONTH, logtime) =  6 THEN 1 END) jun,
             SUM(CASE WHEN DATEPART(MONTH, logtime) =  7 THEN 1 END) jul,
             SUM(CASE WHEN DATEPART(MONTH, logtime) =  8 THEN 1 END) aug,
             SUM(CASE WHEN DATEPART(MONTH, logtime) =  9 THEN 1 END) sep,
             SUM(CASE WHEN DATEPART(MONTH, logtime) = 10 THEN 1 END) oct,
             SUM(CASE WHEN DATEPART(MONTH, logtime) = 11 THEN 1 END) nov,
             SUM(CASE WHEN DATEPART(MONTH, logtime) = 12 THEN 1 END) dec
        FROM somelog (NOLOCK)
       GROUP BY DATEPART(HOUR, logtime)
    ) l 
        ON h.hour = l.hour
    

    またはPIVOT

    WITH hour_list AS (
      SELECT 0 hour
      UNION ALL
      SELECT hour + 1 FROM hour_list WHERE hour < 23
    )
    SELECT h.hour,
           COALESCE([1],  0) jan,
           COALESCE([2],  0) feb,
           COALESCE([3],  0) mar,
           COALESCE([4],  0) apr,
           COALESCE([5],  0) may,
           COALESCE([6],  0) jun,
           COALESCE([7],  0) jul,
           COALESCE([8],  0) aug,
           COALESCE([9],  0) sep,
           COALESCE([10], 0) oct,
           COALESCE([11], 0) nov,
           COALESCE([12], 0) dec
      FROM hour_list h LEFT JOIN 
    (
      SELECT DATEPART(MONTH, logtime) month,
             DATEPART(HOUR, logtime) hour,
             COUNT(*) log_count
        FROM somelog (NOLOCK)
       GROUP BY DATEPART(MONTH, logtime), DATEPART(HOUR, logtime)
    ) s
    PIVOT
    (
      SUM(log_count) FOR month IN([1],[2],[3],[4],[5],[6],[7],[8],[9],[10],[11],[12])
    ) p
        ON h.hour = p.hour
    

    両方のクエリの出力例:

    | HOUR | JAN | FEB | MAR | APR | MAY | JUN | JUL | AUG | SEP | OCT | NOV | DEC |
    |------|-----|-----|-----|-----|-----|-----|-----|-----|-----|-----|-----|-----|
    |    0 |   2 |   0 |   0 |   0 |   0 |   0 |   0 |   0 |   0 |   0 |   0 |   0 |
    |    1 |   1 |   0 |   0 |   0 |   0 |   0 |   0 |   0 |   0 |   0 |   0 |   0 |
    |    2 |   0 |   1 |   0 |   0 |   0 |   0 |   0 |   0 |   0 |   0 |   0 |   0 |
    |    3 |   0 |   0 |   1 |   0 |   0 |   0 |   0 |   0 |   0 |   0 |   0 |   0 |
    |    4 |   0 |   0 |   0 |   1 |   0 |   0 |   0 |   0 |   0 |   0 |   0 |   0 |
    ...
    

    これがSQLFiddle です。 デモ(CASEを使用 )
    こちらが SQLFiddle デモ(PIVOTを使用 )




    1. リンクリストのmysqlクエリ

    2. PHP 7でMySQLi拡張機能を有効にするにはどうすればよいですか?

    3. PHPを使用してmySQLiクエリから各行をエコーする方法は?

    4. Oracle ADF-Tomcat 6.x-MySql 5.5-java.lang.AbstractMethodError