加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > MsSql教程 > 正文

SqlServer和Oracle中一些常用的sql语句3 行列转换

发布时间:2020-12-12 13:58:11 所属栏目:MsSql教程 来源:网络整理
导读:--217,SQL SERVERSELECT 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 ( SELEC

--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),120),CUST_NAME
     UNION ALL
     SELECT CONVERT(CHAR(10),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),120)
     ) A
GROUP BY Cust_Name


--218,SUM(
      CASE WHEN CONVERT(CHAR(10),120)='2009-08-01' THEN Qty* Price END
      ) "2009-08-01",120) ='2009-08-02' THEN Qty* Price  END
      ) "2009-08-02",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-03' THEN AR END) "2009-08-03"
FROM 
    (
    SELECT TO_CHAR(Order_Date,'YYYY-MM-DD')Order_Date,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,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,"2009-08-01","2009-08-02","2009-08-03"
FROM 
  (
  SELECT CONVERT(CHAR(10),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),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,"2009-08-03"
FROM 
  (
  SELECT TO_CHAR(Order_Date,Cust_Name
         --,Qty
         --,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,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-03' THEN AR END) "2009-08-03"
       INTO Orders_Pivot
FROM 
    (
    SELECT CONVERT(CHAR(10),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),CUST_NAME
    ) A
GROUP BY Cust_Name

--226,ORACLE
DROP TABLE Orders_Pivot;

CREATE TABLE Orders_Pivot
AS
SELECT Cust_Name,CUST_NAME
    ) A
GROUP BY Cust_Name 


--227,AR
FROM 
     (?
     SELECT CAST('2009-08-01' AS datetime) Order_Date -- SQL SERVER
            --DATE'2009-08-01' -- ORACLE,"2009-08-01" AR
     FROM Orders_Pivot
     UNION ALL
     SELECT CAST('2009-08-02' AS datetime) Order_Date,"2009-08-02" AR
     FROM Orders_Pivot
     UNION ALL
     SELECT CAST('2009-08-03' AS datetime) Order_Date,"2009-08-03" AR
     FROM Orders_Pivot
     ) A
WHERE AR IS NOT NULL


--227,ORACLE
SELECT Order_Date,AR
FROM 
     (?
     SELECT DATE'2009-08-01' Order_Date,"2009-08-01" AR
     FROM Orders_Pivot
     UNION ALL
     SELECT DATE'2009-08-02' Order_Date,"2009-08-02" AR
     FROM Orders_Pivot
     UNION ALL
     SELECT DATE'2009-08-03' Order_Date,"2009-08-03" AR
     FROM Orders_Pivot
     ) A
WHERE AR IS NOT NULL 

--228,AR,SUBSTRING(Order_Date,6,5) "Date"
FROM 
  (
  SELECT Cust_Name,"2009-08-03"  
  FROM Orders_Pivot
  ) D
UNPIVOT
  (
     AR FOR Order_Date 
          IN ([2009-08-01],"2009-08-03") 
  ) P

--228,SUBSTR(Order_Date,"2009-08-03"  
  FROM Orders_Pivot
  ) D
UNPIVOT
  (
     AR FOR Order_Date 
          IN ("2009-08-01","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,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,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,ROW_NUMBER() OVER (PARTITION BY EmpName ORDER BY Major) FldIdx
      FROM Specialty
      ) A
GROUP BY EmpName
ORDER BY COUNT(*)DESC

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读