zoukankan      html  css  js  c++  java
  • SqlServer和Oracle中一些常用的sql语句3 行列转换

    --217, SQL SERVER
    SELECT Cust_Name
           , MAX(CASE WHEN Order_Date ='2009-08-01' THEN AR END) "2009-08-01"
           , MAX(CASE WHEN Order_Date ='2009-08-02' THEN AR END) "2009-08-02"
           , MAX(CASE WHEN Order_Date ='2009-08-03' THEN AR END) "2009-08-03"
    FROM 
        (
         SELECT CONVERT(CHAR(10), Order_Date, 120) Order_Date
               , CUST_NAME
               , SUM(Qty * Price) AR
         FROM Orders
         WHERE Order_Date BETWEEN '2009-08-01' 
                                     AND CAST('2009-08-03' AS datetime) +1
         GROUP BY CONVERT(CHAR(10), Order_Date, 120)
                   , CUST_NAME
         UNION ALL
         SELECT CONVERT(CHAR(10), Order_Date, 120) Order_Date
                ,NULL CUST_NAME
                , SUM(Qty * Price) AR
         FROM Orders
         WHERE Order_Date BETWEEN '2009-08-01' 
                             AND CAST('2009-08-03' AS datetime) +1
         GROUP BY CONVERT(CHAR(10), Order_Date, 120)
         ) A
    GROUP BY Cust_Name
    
    
    --218, SQL SERVER
    SELECT Cust_Name
    , SUM(
          CASE WHEN CONVERT(CHAR(10),Order_Date, 120)='2009-08-01' THEN Qty* Price END
          ) "2009-08-01"
    , SUM(
          CASE WHEN CONVERT(CHAR(10),Order_Date, 120) ='2009-08-02' THEN Qty* Price  END
          ) "2009-08-02"
    , SUM(
          CASE WHEN CONVERT(CHAR(10),Order_Date, 120) ='2009-08-03' THEN Qty* Price  END
          ) "2009-08-03"
    FROM Orders 
    WHERE 1=1
          AND Order_Date BETWEEN '2009-08-01' AND CAST('2009-08-03' AS datetime) +1
    GROUP BY Cust_Name
    
    --218, ORACLE
    SELECT Cust_Name
          , MAX(CASE WHEN Order_Date ='2009-08-01' THEN AR END) "2009-08-01"
          , MAX(CASE WHEN Order_Date ='2009-08-02' THEN AR END) "2009-08-02"
          , MAX(CASE WHEN Order_Date ='2009-08-03' THEN AR END) "2009-08-03"
    FROM 
        (
        SELECT TO_CHAR(Order_Date, 'YYYY-MM-DD')Order_Date
               , CUST_NAME
             , SUM(Qty * Price) AR
        FROM Orders
        WHERE Order_Date BETWEEN DATE'2009-08-01' 
                           AND DATE'2009-08-03' +1
        GROUP BY TO_CHAR(Order_Date, 'YYYY-MM-DD')
                  , CUST_NAME
        UNION ALL
        SELECT TO_CHAR(Order_Date, 'YYYY-MM-DD') Order_Date
               ,NULL CUST_NAME
               , SUM(Qty * Price) AR
        FROM Orders
        WHERE Order_Date BETWEEN DATE'2009-08-01' 
                           AND TO_DATE('2009-08-03', 'YYYY-MM-DD') +1
        GROUP BY Order_Date
        ) A
    GROUP BY Cust_Name 
    
    --220, SQL SERVER
    SELECT Cust_Name
           , "2009-08-01"
           , "2009-08-02"
           , "2009-08-03"
    FROM 
      (
      SELECT CONVERT(CHAR(10),Order_Date, 120) Order_Date
            , Cust_Name
            , Qty * Price AR
      FROM Orders
      WHERE 1=1
            AND Order_Date BETWEEN '2009-08-01' AND '2009-08-04'
      )AS D
    PIVOT
      (
      SUM(AR)
      FOR Order_Date 
            IN ([2009-08-01], [2009-08-02], "2009-08-03")
      ) AS P
    --220, SQL SERVER
    SELECT Order_Date
           ,[李先生] 
           , [张先生]
           , [曹先生]
           , [陈先生]
    FROM 
      (
      SELECT CONVERT(CHAR(10),Order_Date, 120) Order_Date
               , Cust_Name
               , Qty
               , Price
               , Qty*Price AS AR
      FROM Orders
      WHERE 1=1
            AND Order_Date BETWEEN '2009-08-01' AND '2009-08-04'
      )AS D
    PIVOT
      (
        SUM(AR)
               FOR Cust_Name 
                   IN ([李先生], [张先生], [曹先生], [陈先生])
      ) AS P
      
    --222, ORACLE
    SELECT Cust_Name
           , "2009-08-01"
           , "2009-08-02"
           , "2009-08-03"
    FROM 
      (
      SELECT TO_CHAR(Order_Date, 'YYYY-MM-DD') Order_Date
             , Cust_Name
             --, Qty
             --, Price
             , Qty * Price AR
      FROM ORDERS
      WHERE 1=1
             AND Order_Date BETWEEN date'2009-08-01' AND date'2009-08-04'
    ) D
    PIVOT
      (
      SUM(AR)
      FOR Order_Date
           IN ('2009-08-01' AS "2009-08-01", '200908-02' "2009-08-02", '2009-08-03' "2009-08-03")
      ) P
    
    --223, ORACLE
    SELECT *
    FROM 
        (
        SELECT TO_CHAR(Order_Date, 'YYYY-MM-DD') OrderDate
              , Cust_Name
              , Qty
              , Price
        FROM Orders
        WHERE 1=1
               AND Order_Date BETWEEN date'2009-08-01' AND date'2009-08-04'
        )
        PIVOT
        (   
           SUM(Qty * Price) AS "AR"
           , COUNT(*) AS "Qty" 
           FOR OrderDate
                 IN ('2009-08-01' AS "08-01", '2009-08-02' "08-02", '2009-08-03' "08-03")
        ) P
        
    


     

    --226, SQL SERVER
    DROP TABLE Orders_Pivot
    G0
    
    SELECT Cust_Name
           , MAX(CASE WHEN Order_Date ='2009-08-01' THEN AR END) "2009-08-01"
           , MAX(CASE WHEN Order_Date ='2009-08-02' THEN AR END) "2009-08-02"
           , MAX(CASE WHEN Order_Date ='2009-08-03' THEN AR END) "2009-08-03"
           INTO Orders_Pivot
    FROM 
        (
        SELECT CONVERT(CHAR(10), Order_Date, 120) Order_Date
               , CUST_NAME
               , SUM(Qty * Price) AR
        FROM Orders
        WHERE 1=1
               AND Order_Date BETWEEN '2009-08-01' AND CAST('2009-08-03' AS datetime) +1
        GROUP BY CONVERT(CHAR(10), Order_Date, 120)
                 , CUST_NAME
        ) A
    GROUP BY Cust_Name
    
    --226, ORACLE
    DROP TABLE Orders_Pivot;
    
    CREATE TABLE Orders_Pivot
    AS
    SELECT Cust_Name
          , MAX(CASE WHEN Order_Date ='2009-08-01' THEN AR END) "2009-08-01"
          , MAX(CASE WHEN Order_Date ='2009-08-02' THEN AR END) "2009-08-02"
          , MAX(CASE WHEN Order_Date ='2009-08-03' THEN AR END) "2009-08-03"
    FROM 
        (
        SELECT TO_CHAR(Order_Date, 'YYYY-MM-DD')Order_Date
               , CUST_NAME
             , SUM(Qty * Price) AR
        FROM Orders
        WHERE Order_Date BETWEEN DATE'2009-08-01' 
                           AND DATE'2009-08-03' +1
        GROUP BY TO_CHAR(Order_Date, 'YYYY-MM-DD')
                  , CUST_NAME
        ) A
    GROUP BY Cust_Name 
    
    
    --227, SQL SERVER
    SELECT Order_Date, Cust_Name, AR
    FROM 
         (�
         SELECT CAST('2009-08-01' AS datetime) Order_Date -- SQL SERVER
                --DATE'2009-08-01' -- ORACLE
                , Cust_Name
                , "2009-08-01" AR
         FROM Orders_Pivot
         UNION ALL
         SELECT CAST('2009-08-02' AS datetime) Order_Date
                , Cust_Name
                , "2009-08-02" AR
         FROM Orders_Pivot
         UNION ALL
         SELECT CAST('2009-08-03' AS datetime) Order_Date
                , Cust_Name
                , "2009-08-03" AR
         FROM Orders_Pivot
         ) A
    WHERE AR IS NOT NULL
    
    
    --227, ORACLE
    SELECT Order_Date, Cust_Name, AR
    FROM 
         (�
         SELECT DATE'2009-08-01' Order_Date
                , Cust_Name
                , "2009-08-01" AR
         FROM Orders_Pivot
         UNION ALL
         SELECT DATE'2009-08-02' Order_Date
                , Cust_Name
                , "2009-08-02" AR
         FROM Orders_Pivot
         UNION ALL
         SELECT DATE'2009-08-03' Order_Date
                , Cust_Name
                , "2009-08-03" AR
         FROM Orders_Pivot
         ) A
    WHERE AR IS NOT NULL 
    
    --228, SQL SERVER
    SELECT Order_Date 
           , Cust_Name
           , AR
           , SUBSTRING(Order_Date, 6,5) "Date"
    FROM 
      (
      SELECT Cust_Name, "2009-08-01" , "2009-08-02", "2009-08-03"  
      FROM Orders_Pivot
      ) D
    UNPIVOT
      (
         AR FOR Order_Date 
              IN ([2009-08-01], [2009-08-02], "2009-08-03") 
      ) P
    
    --228, ORACLE
    SELECT Order_Date 
           , Cust_Name
           , AR
           , SUBSTR(Order_Date, 6,5) "Date"
    FROM 
      (
      SELECT Cust_Name, "2009-08-01" , "2009-08-02", "2009-08-03"  
      FROM Orders_Pivot
      ) D
    UNPIVOT
      (
         AR FOR Order_Date 
              IN ("2009-08-01", "2009-08-02", "2009-08-03") 
      ) P
      
    --230, ORALCE / SQL SERVER 
    SELECT P.Cust_Name
           , P."2009-08-01"
           , P."2009-08-02"
           , P."2009-08-03"
           , I.N
    FROM Orders_Pivot P, Tally I
    WHERE 1=1
           AND N<=3
    ORDER BY 1, 4
     
    
    --231, ORALCE / SQL SERVER
    SELECT Order_Date
           , Cust_Name
           , AR
    FROM 
        (
        SELECT 
             CASE N WHEN 1 THEN '2009-08-01'
                     WHEN 2 THEN '2009-08-02'
                     WHEN 3 THEN '2009-08-03'
             END Order_Date
             , Cust_Name
             , CASE N WHEN 1 THEN "2009-08-01"
                       WHEN 2 THEN "2009-08-02"
                       WHEN 3 THEN "2009-08-03"
              END AR
        FROM Orders_Pivot P, Tally I 
        WHERE 1=1
              AND N<=3
        ) A
    WHERE AR IS NOT NULL


    --234, ORACLE/SQL SERVER 
    SELECT EmpName
          , Major
          , ROW_NUMBER() OVER (PARTITION BY EmpName ORDER BY Major) FldIdx
    FROM Specialty
    
    --236, ORACLE / SQL SERVER
    SELECT EmpName
          , MAX(CASE WHEN FldIdx=1 THEN Major END) Fld1
          , MAX(CASE WHEN FldIdx=2 THEN Major END) Fld2
          , MAX(CASE WHEN FldIdx=3 THEN Major END) Fld3
          , COUNT(*) FldCount
    FROM 
           (
          SELECT EmpName
                  , Major
                  , ROW_NUMBER() OVER (PARTITION BY EmpName ORDER BY Major) FldIdx
          FROM Specialty
          ) A
    GROUP BY EmpName
    ORDER BY COUNT(*)DESC

  • 相关阅读:
    Linux常用命令(二)
    C#异步调用
    Ajax运用总结
    SQL Server2005 FOR XML PATH 语句的应用
    SQL Server 2005 处理交叉表
    如何控制并发和控制死锁(内含pb的处理要点)
    WPF 中的换行符
    C#委托的异步调用
    pivot 附近有语法错误,您可能需要将当前数据库的兼容级别设置为更高的值。
    应用系统BUG分布小结
  • 原文地址:https://www.cnblogs.com/smartsmile/p/6234278.html
Copyright © 2011-2022 走看看