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加入了它们。谢谢你的帮助。