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

posted @ 2013-06-21 14:39  深南大道  阅读(211)  评论(0编辑  收藏  举报