Sql 在一组日期上迭代存储
早上好 我正在寻找解决以下问题的有效方法: 请注意,我简化并改变了实际问题;然而,这不应该反映在我所期待的结果上 基本上,如果我想确定特定公司拥有的每个商店的交易数量(按日期分组),我必须运行以下查询:Sql 在一组日期上迭代存储,sql,sql-server,sql-server-2008-r2,Sql,Sql Server,Sql Server 2008 R2,早上好 我正在寻找解决以下问题的有效方法: 请注意,我简化并改变了实际问题;然而,这不应该反映在我所期待的结果上 基本上,如果我想确定特定公司拥有的每个商店的交易数量(按日期分组),我必须运行以下查询: Select date_of_transaction ,store ,COUNT(*) from transactions t1 group by date_of_transaction,store order by date_of_transaction 但是,此查询是不够的,因为它不返
Select
date_of_transaction
,store
,COUNT(*)
from transactions t1
group by date_of_transaction,store
order by date_of_transaction
但是,此查询是不够的,因为它不返回事务数等于“0”的存储和日期
例如,如果存储A在2012年10月1日没有提交任何事务,则我的结果集中将缺少该行
这就是为什么,我想强制输入过去一年的所有365天,然后显示每个商店的每个日期。
换言之,如果公司拥有3家店铺,我每年每天都需要3条记录,即使交易数量为“0”:
Date Store Number
1/1/2012 A 1
1/1/2012 B 0
1/1/2012 C 3
2/1/2012 A 1
2/1/2012 B 2
2/1/2012 C 0
3/1/2012 A 1
3/1/2012 B 0
3/1/2012 C 0
我有一个日历表,我用它来“联合”商店并强迫他们进去,但这必须是一个更好的方法
问候
Kiril类似于这样的内容,应该按照您的要求执行您需要的操作,以日历和存储表为基础进行查询,获取输出中的所有日期和存储,然后左键加入事务表:
SELECT Calendar.Date, Stores.Store, COUNT(T1.transaction_id) AS Number
FROM Calendar, Stores
LEFT JOIN Transactions T1 ON T1.date_of_transaction = Calendar.date
AND T1.store = Stores.store
GROUP BY Calendar.Date, Stores.Store
为什么不使用公共表表达式来计算不同的存储和日期呢 下面是一个测试表,上面有数据
--
-- My database
--
-- Play in temp
use tempdb;
go
-- Create a table
CREATE TABLE my_transactions
(
my_id INT identity(1, 1) primary key,
my_date DATETIME,
my_store CHAR(1),
my_sale MONEY
);
-- Insert some data
INSERT INTO my_transactions (my_date, my_store, my_sale)
VALUES
('1/1/2012', 'A', 100),
('1/1/2012', 'C', 100),
('1/1/2012', 'C', 100),
('1/1/2012', 'C', 100),
('2/1/2012', 'A', 200),
('2/1/2012', 'B', 200),
('2/1/2012', 'B', 200),
('3/1/2012', 'A', 300);
-- Show the data
SELECT * FROM my_transactions;
我将使用理货表概念来创建月份开始日期、存储和创建报告
--
-- My report query
--
;
WITH cteMonths (my_number, my_date) AS
(
SELECT
ROW_NUMBER() OVER(ORDER BY a.name) AS my_number,
DATEADD(M, ROW_NUMBER() OVER(ORDER BY a.name) - 1, '2012-01-01') as my_date
FROM
sys.objects a
CROSS JOIN
sys.objects b
),
cteStores (my_store) as
(
SELECT DISTINCT my_store FROM my_transactions
)
SELECT
MS.my_date,
MS.my_store,
COUNT(T.my_id) as my_total
FROM
( SELECT * FROM cteMonths CROSS JOIN cteStores WHERE my_number < 4 ) MS
LEFT JOIN
my_transactions AS T ON MS.my_date = T.my_date and MS.my_store = T.my_store
GROUP BY
MS.my_date,
MS.my_store
ORDER BY
MS.my_date,
MS.my_store
GO
我无法识别日历和存储表之间的任何关系。那又怎样?上面的查询不依赖于这两者之间的关系。它执行笛卡尔连接,这样您就可以为日历表中的每条记录获取Stores表中的每条记录。它只依赖于事务表和存储表之间的关系,以及事务表和日历表之间的关系。不管怎样,我已经在isnullvw.Store\u Start\u Date,'19000101'和isnullvw.Store\u End\u Date,GETDATE之间的cal\u daydate加入了它们。谢谢你的帮助。