oracle和sqlserver转换,《转》SqlServer和Oracle中一些常用的sql语句3-行列转换

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

viewspace-765389

[sql]

--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

viewspace-765389

[sql]

--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

viewspace-765389

[sql]

--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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值