Sql选择带有count的子查询

时间:2015-04-23 13:17:52

标签: sql group-by subquery

好的,我有3张桌子: [AXprod].[dbo].[RMSPOSINVOICE][AXPROD].[dbo].[discountcard][IntegrationProd].[dbo].[POS_KvitoGalva]。我想知道什么时候折扣卡在一个发明地点和使用时间多次使用。表格[IntegrationProd].[dbo].[POS_KvitoGalva]有这些时间。我使用此代码来获取每张卡每天使用的时间:

 sELECT a.discountcardid,count(a.discountcardid)
  FROM [AXprod].[dbo].[RMSPOSINVOICE] a
  inner join [AXPROD].[dbo].[discountcard] b
  on a.discountcardid = b.discountcardid
  inner join [IntegrationProd].[dbo].[POS_KvitoGalva] c
  on a.possalesid = c.id
   where a.dataareaid = 'ermi' and len(a.discountcardid) > '0' and b.dataareaid = 'ermi' and ('500' = a.inventlocationid )
 and (a.invoicedate >= '2015-04-22 00:00:00.000' and a.invoicedate <= '2015-04-22 00:00:00.000')
  group by a.discountcardid,a.inventlocationid,a.posnumber
   having count(a.discountcardid) > '1'

我得到以下结果:

DISCOUNTCARDID COUNT
123456           2
145962           2

我有一个查询来查找每张卡的使用时间(日期和时间)

 SELECT a.discountcardid,a.inventlocationid,a.posnumber,year,month,day,hour,minute,c.id
FROM [AXprod].[dbo].[RMSPOSINVOICE] a
  inner join [AXPROD].[dbo].[discountcard] b
  on a.discountcardid = b.discountcardid
  inner join [IntegrationProd].[dbo].[POS_KvitoGalva] c
  on a.possalesid = c.id
   where a.dataareaid = 'ermi' and len(a.discountcardid) > '0' and b.dataareaid = 'ermi' and ('500' = a.inventlocationid )
 and (a.invoicedate >= '2015-04-22 00:00:00.000' and a.invoicedate <= '2015-04-22 00:00:00.000')
  group by a.discountcardid,a.inventlocationid,a.posnumber,year,month,day,hour,minute,c.id
   order by DISCOUNTCARDID 

我得到了结果:

discountcardid  inventlocationid    posnumber   year    month   day hour    minute  id
123456      500 7   2015    4   22  12  44  6355302
123456      500 7   2015    4   22  14  24  6355302
145962      500 7   2015    4   22  13  56  6355302
145962      500 7   2015    4   22  13  24  6355302
145555      500 7   2015    4   22  12  11  5465465

问题: 我不想得到只使用过一次的折扣卡,所以我试试这个:

 SELECT a.discountcardid,a.inventlocationid,a.posnumber,year,month,day,hour,minute,c.id,
 ( sELECT count(s.discountcardid)
  FROM [AXprod].[dbo].[RMSPOSINVOICE] s
  inner join [AXPROD].[dbo].[discountcard] b
  on s.discountcardid = b.discountcardid
  inner join [IntegrationProd].[dbo].[POS_KvitoGalva] c
  on s.possalesid = c.id
   where s.dataareaid = 'ermi' and len(s.discountcardid) > '0' and b.dataareaid = 'ermi' and ('500' = s.inventlocationid )
 and (s.invoicedate >= '2015-04-22 00:00:00.000' and s.invoicedate <= '2015-04-22 00:00:00.000') and s.DISCOUNTCARDID = a.DISCOUNTCARDID 
  group by s.discountcardid,s.inventlocationid,s.posnumber
   having count(a.discountcardid) > '1')
FROM [AXprod].[dbo].[RMSPOSINVOICE] a
  inner join [AXPROD].[dbo].[discountcard] b
  on a.discountcardid = b.discountcardid
  inner join [IntegrationProd].[dbo].[POS_KvitoGalva] c
  on a.possalesid = c.id
   where a.dataareaid = 'ermi' and len(a.discountcardid) > '0' and b.dataareaid = 'ermi' and ('500' = a.inventlocationid )
 and (a.invoicedate >= '2015-04-22 00:00:00.000' and a.invoicedate <= '2015-04-22 00:00:00.000')
  group by a.discountcardid,a.inventlocationid,a.posnumber,year,month,day,hour,minute,c.id
   order by DISCOUNTCARDID 

但我得到的是所有列中最后一个字段中的相同数量的值和NULL。我希望自己清楚明白;)。

1 个答案:

答案 0 :(得分:1)

您应该能够调用一次查询并使用窗口函数来获取计数。我不相信你可以在where语句中使用分析函数,所以我添加了一个额外的SELECT语句来添加WHERE&gt; 1为计数。

SELECT * 
FROM (SELECT 
    a.discountcardid,
    a.inventlocationid,
    a.posnumber,
    year,
    month,
    day,
    hour,
    minute,
    c.id,
    COUNT(*) OVER (PARTITION BY a.discountcardid, a.inventlocationid, a.posnumber) AS CardCount
FROM AXprod.dbo.RMSPOSINVOICE a
JOIN AXprod.dbo.discountcard b
    ON b.discountcardid = a.discountcardid
JOIN IntegrationProd.dbo.POS_KvitoGalva c
    ON c.id = a.possalesid
WHERE a.dataareaid = 'ermi' 
AND len(a.discountcardid) > '0' 
AND b.dataareaid = 'ermi' 
AND a.inventlocationid = 500
AND a.invoicedate >= '2015-04-22 00:00:00.000' 
AND a.invoicedate <= '2015-04-22 00:00:00.000'
) d
WHERE d.CardCount > 1
ORDER BY d.discountcardid