Sql 订购月度和季度查询
首先,我要向所有参加本论坛的人表示衷心的感谢。在[在此插入项目名称]到期的前一天凌晨3点,大量的知识和示例已经成为了一个惊人的资源,我来到了一堵墙……哈哈 我创建了一个简单的查询,作为按月份和季度划分的数据的定期报告运行,它提取正确的值。然而,我在订购方面遇到了麻烦。这是我希望查询结果返回的内容:Sql 订购月度和季度查询,sql,sql-server-2008,union,datepart,Sql,Sql Server 2008,Union,Datepart,首先,我要向所有参加本论坛的人表示衷心的感谢。在[在此插入项目名称]到期的前一天凌晨3点,大量的知识和示例已经成为了一个惊人的资源,我来到了一堵墙……哈哈 我创建了一个简单的查询,作为按月份和季度划分的数据的定期报告运行,它提取正确的值。然而,我在订购方面遇到了麻烦。这是我希望查询结果返回的内容: Month DM TM FI GR NM Total JAN 0 0
Month DM TM FI GR NM Total
JAN 0 0 50000 0 0 50000
FEB 0 0 535000 0 620043.77 1255043.77
MAR 0 0 614146 5611 3016237.91 3637788.91
Q1 0 0 1199146 5611 3636281.68 4942832.68
APR 0 0 1230059 6395 1278525.79 2578589.79
MAY 0 45796 101160 15473.18 1357877.7 1932405.88
JUN 213716.34 141050 746302.28 25007.68 2552277.35 3963233.35
Q2 213716.34 186846 2077521.28 46875.86 5188680.84 8474229.02
JUL 258362.92 49541 359178.5 19674.33 803987.99 1928917.74
AUG 62750.35 9159 151561.28 15020.88 1248746.28 1533091.93
SEP 262246.37 136064 198365.99 37397.73 3271355.71 4017822.94
Q3 583359.64 194764 709105.77 72092.94 5324089.98 7479832.61
OCT 198565.1 189847 626951.11 29517 978947.85 2048681.2
NOV 22391 53652 155140.84 11444.75 470482.95 714747.68
Q4 220956.1 243499 782091.95 40961.75 1449430.8 2763428.88
然而,这正是我陷入困境的地方:
Month DM TM FI GR NM Total
APR 0.00 0.00 1230059.00 6395.00 1275636.61 2575700.61
AUG 62750.35 9159.00 151561.28 15020.88 1248286.28 1532631.93
FEB 0.00 0.00 535000.00 0.00 587337.00 1222337.00
JAN 0.00 0.00 50000.00 0.00 0.00 50000.00
JUL 258362.92 49541.00 359178.50 19674.33 803417.96 1933347.71
JUN 213716.34 141050.00 746302.28 25007.68 2551383.23 3962339.23
MAR 0.00 0.00 614146.00 5611.00 2920193.41 3541744.41
MAY 0.00 45796.00 101160.00 15473.18 1356653.55 1931181.73
NOV 26213.00 61683.00 130270.90 13099.75 496460.05 729362.84
OCT 198565.10 189847.00 626951.11 29517.00 978797.85 2043531.20
Q1 0.00 0.00 1199146.00 5611.00 3507530.41 4814081.41
Q2 213716.34 186846.00 2077521.28 46875.86 5183673.39 8469221.57
Q3 583359.64 194764.00 709105.77 72092.94 5322894.95 7483637.58
Q4 224778.10 251530.00 757222.01 42616.75 1475257.90 2772894.04
SEP 262246.37 136064.00 198365.99 37397.73 3271190.71 4017657.94
下面是一个查询,它可以获得按字母顺序排列的结果:
SELECT
CASE DATEPART(mm, dtDate)
WHEN 01 THEN 'JAN' WHEN 02 THEN 'FEB' WHEN 03 THEN 'MAR'
WHEN 04 THEN 'APR' WHEN 05 THEN 'MAY' WHEN 06 THEN 'JUN'
WHEN 07 THEN 'JUL' WHEN 08 THEN 'AUG' WHEN 09 THEN 'SEP'
WHEN 10 THEN 'OCT' WHEN 11 THEN 'NOV' WHEN 12 THEN 'DEC'
END
AS 'Month',
SUM(CASE WHEN sAccount = 'DM' AND sChannel = 'DM' THEN mAmount
ELSE 0 END) AS 'DM',
SUM(CASE WHEN sAccount = 'DM' AND sChannel = 'TM' THEN mAmount
ELSE 0 END) AS 'TM',
SUM(CASE WHEN sAccount = 'FI' AND sChannel = 'FI' THEN mAmount
ELSE 0 END) AS 'FI',
SUM(CASE WHEN sAccount = 'FI' AND sChannel = 'GR' THEN mAmount
ELSE 0 END) AS 'GR',
SUM(CASE WHEN sAccount = 'NM' THEN mAmount
ELSE 0 END) AS 'NM',
SUM(mAmount) AS 'Total'
FROM Contrib
WHERE iDeleted = '0'
GROUP BY DATEPART(mm, dtDate)
UNION
SELECT
CASE DATEPART(qq, dtDate)
WHEN 01 THEN 'Q1'
WHEN 02 THEN 'Q2'
WHEN 03 THEN 'Q3'
WHEN 04 THEN 'Q4'
END
AS 'Month',
SUM(CASE WHEN sAccount = 'DM' AND sChannel = 'DM' THEN mAmount
ELSE 0 END) AS 'DM',
SUM(CASE WHEN sAccount = 'DM' AND sChannel = 'TM' THEN mAmount
ELSE 0 END) AS 'M',
SUM(CASE WHEN sAccount = 'FI' AND sChannel = 'FI' THEN mAmount
ELSE 0 END) AS 'FI',
SUM(CASE WHEN sAccount = 'FI' AND sChannel = 'GR' THEN mAmount
ELSE 0 END) AS 'GR',
SUM(CASE WHEN sAccount = 'NM' THEN mAmount
ELSE 0 END) AS 'NM',
SUM(mAmount) AS 'Total'
FROM Contrib
WHERE iDeleted = '0'
GROUP BY DATEPART(qq, dtDate)
我尝试了多种方法将order by子句添加到查询中,但没有成功(通常是获取Msg 104,级别16…“如果语句包含UNION、INTERSECT或EXCEPT运算符,order by项必须出现在select列表中”)。我怀疑我的问题是由于union和2个不同的datepart函数(月vs季度)造成的
我还是个新手,所以请告诉我是否有更有效的方法来组织这个查询,或者你是否认为你知道我可能会在哪里遇到麻烦
非常感谢
Pat我认为您需要在select中添加另一列,并使用它进行订购。。。也许是这样的
SELECT
CASE DATEPART(mm, dtDate)
WHEN 01 THEN '01' WHEN 02 THEN '02' WHEN 03 THEN '04'
WHEN 04 THEN '05' WHEN 05 THEN '06' WHEN 06 THEN '07'
WHEN 07 THEN '09' WHEN 08 THEN '10' WHEN 09 THEN '11'
WHEN 10 THEN '13' WHEN 11 THEN '14' WHEN 12 THEN '15'
END
AS 'Order',
CASE DATEPART(mm, dtDate)
WHEN 01 THEN 'JAN' WHEN 02 THEN 'FEB' WHEN 03 THEN 'MAR'
WHEN 04 THEN 'APR' WHEN 05 THEN 'MAY' WHEN 06 THEN 'JUN'
WHEN 07 THEN 'JUL' WHEN 08 THEN 'AUG' WHEN 09 THEN 'SEP'
WHEN 10 THEN 'OCT' WHEN 11 THEN 'NOV' WHEN 12 THEN 'DEC'
END
AS 'Month',
SUM(CASE WHEN sAccount = 'DM' AND sChannel = 'DM' THEN mAmount
ELSE 0 END) AS 'DM',
SUM(CASE WHEN sAccount = 'DM' AND sChannel = 'TM' THEN mAmount
ELSE 0 END) AS 'TM',
SUM(CASE WHEN sAccount = 'FI' AND sChannel = 'FI' THEN mAmount
ELSE 0 END) AS 'FI',
SUM(CASE WHEN sAccount = 'FI' AND sChannel = 'GR' THEN mAmount
ELSE 0 END) AS 'GR',
SUM(CASE WHEN sAccount = 'NM' THEN mAmount
ELSE 0 END) AS 'NM',
SUM(mAmount) AS 'Total'
FROM Contrib
WHERE iDeleted = '0'
GROUP BY DATEPART(mm, dtDate)
UNION
SELECT
CASE DATEPART(qq, dtDate)
WHEN 01 THEN '05'
WHEN 02 THEN '08'
WHEN 03 THEN '12'
WHEN 04 THEN '16'
END
AS 'Order',
CASE DATEPART(qq, dtDate)
WHEN 01 THEN 'Q1'
WHEN 02 THEN 'Q2'
WHEN 03 THEN 'Q3'
WHEN 04 THEN 'Q4'
END
AS 'Month',
SUM(CASE WHEN sAccount = 'DM' AND sChannel = 'DM' THEN mAmount
ELSE 0 END) AS 'DM',
SUM(CASE WHEN sAccount = 'DM' AND sChannel = 'TM' THEN mAmount
ELSE 0 END) AS 'M',
SUM(CASE WHEN sAccount = 'FI' AND sChannel = 'FI' THEN mAmount
ELSE 0 END) AS 'FI',
SUM(CASE WHEN sAccount = 'FI' AND sChannel = 'GR' THEN mAmount
ELSE 0 END) AS 'GR',
SUM(CASE WHEN sAccount = 'NM' THEN mAmount
ELSE 0 END) AS 'NM',
SUM(mAmount) AS 'Total'
FROM Contrib
WHERE iDeleted = '0'
GROUP BY DATEPART(qq, dtDate)
ORDER BY 'Order'
使用
AdventureWorks2012
我使用ROLLUP
SELECT
[Month] = CASE WHEN GROUPING(DATEPART(MM, OrderDate)) = 1 THEN 'Q' + CAST(DATEPART(QQ, OrderDate) AS VARCHAR(2))
ELSE CAST(DATEPART(MM, OrderDate) AS VARCHAR(4)) END,
SUM(TotalDue) [TotalDue]
FROM AdventureWorks.Sales.SalesOrderHeader
GROUP BY DATEPART(YY, OrderDate), DATEPART(QQ, OrderDate), DATEPART(MM, OrderDate) WITH ROLLUP
HAVING GROUPING(DATEPART(QQ, OrderDate))=0
ORDER BY MAX(OrderDate)
根据您的查询调整它
SELECT
CASE WHEN GROUPING(DATEPART(MM, dtDate)) = 1 THEN 'Q' + CAST(DATEPART(QQ, dtDate) AS VARCHAR(2))
ELSE STUFF(CAST(DATEPART(MM, dtDate) AS VARCHAR(4)), 1, 0, REPLICATE('0', 2 - LEN(CAST(DATEPART(MM, dtDate) AS VARCHAR(4))))) END,
SUM(CASE WHEN sAccount = 'DM' AND sChannel = 'DM' THEN mAmount
ELSE 0 END) AS 'DM',
SUM(CASE WHEN sAccount = 'DM' AND sChannel = 'TM' THEN mAmount
ELSE 0 END) AS 'TM',
SUM(CASE WHEN sAccount = 'FI' AND sChannel = 'FI' THEN mAmount
ELSE 0 END) AS 'FI',
SUM(CASE WHEN sAccount = 'FI' AND sChannel = 'GR' THEN mAmount
ELSE 0 END) AS 'GR',
SUM(CASE WHEN sAccount = 'NM' THEN mAmount
ELSE 0 END) AS 'NM',
SUM(mAmount) AS 'Total'
FROM Contrib
WHERE iDeleted = '0'
GROUP BY DATEPART(YY, dtDate), DATEPART(QQ, dtDate), DATEPART(MM, dtDate) WITH ROLLUP
HAVING GROUPING(DATEPART(QQ, dtDate))=0
ORDER BY MAX(dtDate)
你在你的查询中试过一个简单的“按1排序”吗?@abhi嗯,举个例子。第二,这有什么帮助?第一列是月份名称。我不认为我们的目标是在4月、8月、2月之前订购。。。