我正在运行SQL 2008,我的任务是创建一个报告,将“供应商名称”和某些信息组合在一起,然后按财务年度及其季度对其进行分组。
除了我们的财政开始不是在1月而是在11月之后,它逐年进展顺利。我有一个名为'预期到达日期'的日期字段,格式为'yyyy-mm-dd hh:mm; ss.mmm'我不知道如何将其分组以关联:
A。从11月开始到截至10月的财政年度剩余时间的财政年度(2012财年的例子= 2011年11月开始 - 2012年10月底
B。财政季度11月1日至1月31日,2月1日至4月30日,5月1日至7月31日,8月1日至10月31日
这是我已有的代码
SELECT
YEAR([Expected Arrival Date])as 'Year',
MONTH([Expected Arrival Date]) as 'Month',
[Vendor Name],
(SUM(CASE WHEN ([Days Past Due] = 0) THEN [Qty Received] ELSE 0 END) / SUM([Qty Received])) * 100 AS 'On-Time %',
(SUM(CASE WHEN ([Days Past Due] < 0) THEN [Qty Received] ELSE 0 END) / SUM([Qty Received])) * 100 AS 'Early %',
(SUM(CASE WHEN ([Days Past Due] > 0) THEN [Qty Received] ELSE 0 END) / SUM([Qty Received])) * 100 AS 'Late %',
SUM([Qty Received]) aS 'TOTAL'
FROM data_view
GROUP BY YEAR([Expected Arrival Date]),MONTH([Expected Arrival Date]),[Vendor Name]
ORDER by YEAR([Expected Arrival Date]),MONTH([Expected Arrival Date])
如果你有任何有用的指针来创建一个很好的查询,也将不胜感激。
编辑** data_view的结构如下
SELECT [Receipt #], [Vendor Code], [Vendor Name], [PO Applied], [PO Line #], [Item Code], [Item Description], [Expected Arrival Date], [Receiving Date], [Receiving Date Filter],
[Qty Received], [Qty Ordered], [% Received], [PO Date], [Receipt User], DATEDIFF(dd, CAST(CAST([Expected Arrival Date] AS CHAR) AS DATETIME),
CAST(CAST([Receiving Date] AS CHAR) AS DATETIME)) AS [Days Past Due]
FROM (SELECT T1.RCPNUMBER AS [Receipt #], T1.VDCODE AS [Vendor Code], T1.VDNAME AS [Vendor Name], T4.PONUMBER AS [PO Applied],
T3.DETAILNUM AS [PO Line #], T2.ITEMNO AS [Item Code], T2.ITEMDESC AS [Item Description],
CASE WHEN T3.EXPARRIVAL = 0 THEN CASE WHEN T4.EXPARRIVAL = 0 THEN CAST(CAST(T4.DATE AS CHAR) AS DATETIME)
ELSE CAST(CAST(T4.EXPARRIVAL AS CHAR) AS DATETIME) END ELSE CAST(CAST(T3.EXPARRIVAL AS CHAR) AS DATETIME)
END AS [Expected Arrival Date], CAST(CAST(T1.DATE AS CHAR) AS DATETIME) AS [Receiving Date], CAST(CAST(T1.DATE AS CHAR) AS DATETIME)
AS [Receiving Date Filter], T2.RQRECEIVED AS [Qty Received], T3.OQORDERED AS [Qty Ordered],
ROUND(CASE WHEN T2.OQORDERED <> 0 THEN (T2.RQRECEIVED / T2.OQORDERED) * 100 ELSE 100 END, 2) AS [% Received],
CAST(CAST(T4.DATE AS CHAR) AS DATETIME) AS [PO Date], T5.ENTEREDBY AS [Receipt User]
FROM canada.dbo.PORCPH1 AS T1 INNER JOIN
canada.dbo.PORCPH2 AS T5 ON T1.RCPHSEQ = T5.RCPHSEQ INNER JOIN
canada.dbo.PORCPL AS T2 ON T2.RCPHSEQ = T1.RCPHSEQ INNER JOIN
canada.dbo.POPORL AS T3 ON T3.PORHSEQ = T2.PORHSEQ AND T3.PORLSEQ = T2.PORLSEQ INNER JOIN
canada.dbo.POPORH1 AS T4 ON T4.PORHSEQ = T3.PORHSEQ) AS tblReceips
答案 0 :(得分:4)
这样的事情应该有效:
SELECT
YEAR([Expected Arrival Date]) + CASE
WHEN MONTH([Expected Arrival Date]) IN (11, 12) THEN 1
ELSE 0
END As FiscalYear,
CASE
WHEN MONTH([Expected Arrival Date]) IN (11, 12, 1) THEN 1
WHEN MONTH([Expected Arrival Date]) IN (2, 3, 4) THEN 2
WHEN MONTH([Expected Arrival Date]) IN (5, 6, 7) THEN 3
ELSE 4
END As FiscalQuarter,
...
GROUP BY
YEAR([Expected Arrival Date]) + CASE
WHEN MONTH([Expected Arrival Date]) IN (11, 12) THEN 1
ELSE 0
END,
CASE
WHEN MONTH([Expected Arrival Date]) IN (11, 12, 1) THEN 1
WHEN MONTH([Expected Arrival Date]) IN (2, 3, 4) THEN 2
WHEN MONTH([Expected Arrival Date]) IN (5, 6, 7) THEN 3
ELSE 4
END,
[Vendor Name]
ORDER BY
FiscalYear,
FiscalQuarter
;
答案 1 :(得分:3)
Richard Deeming的SQL在MySQL中完美运行,但我对查询的大小不满意,所以我使用基本概念使用内置的MySQL IF()函数创建一个小得多的查询:
SELECT
YEAR(date),
MONTH(date),
YEAR(date) + IF(MONTH(date)>10, 1, 0) as 'FiscalYear',
IF(MONTH(date)>10, 1, CEIL((MONTH(date)+2)/3)) as 'FiscalQuarter'
FROM dates
答案 2 :(得分:1)
对于那些有兴趣从7月开始查询FY的人
SELECT
YEAR(date),
MONTH(date),
YEAR(date) + IF(MONTH(date)>6, 1, 0) as FiscalYear,
IF(MONTH(date)>6, FLOOR((MONTH(date)-4)/3), CEIL((MONTH(date)+6)/3)) as FiscalQuarter
FROM dates