使用相关子查询和多个表进行SELECT

时间:2018-10-30 12:39:22

标签: sql sql-server select correlated-subquery

我有两个表(表1和表2)。我希望将其分组的包括日期(tDate)列和ID(tTillNo)列。还有另一个我想为每个日期和ID求和的值(pValue)。

可以使用每个表中的'tName'和'pName'列来连接表,但是pName列可能有重复项,我想在总和中包括这些重复项。 对于3个子查询,我还需要使用“ pCode”列添加where子句。

我想返回此处显示的列 https://imgur.com/nyNmTzs

但是,由于我正在使用“ MAX(a.tName)”来阻止此字段的分组,因此使用以下代码返回总计不正确的子查询。有人可以建议另一种防止这种情况发生的方法,或者另一种进行此查询的方法吗?

SELECT 
    DATENAME(Month,a.tDate) as 'Month Name', DAY(a.tDate) as 'Day', 
    MONTH(a.tDate) as 'Month', YEAR(a.tDate) as 'Year', a.tTillNo,

    BankedCash=(SELECT ISNULL(CAST(SUM(b.pValue) as numeric(12,2)),0) 
               FROM Table2 b 
                    where MAX(a.tName)=b.pName AND pCode = 'CSH' 
                    or pCode = 'CHQ'),

    CardTransactions=(SELECT ISNULL(CAST(SUM(b.pValue) as numeric(12,2)),0) 
                     FROM Table2 b 
                          where MAX(a.tName)=b.pName AND b.pCode = 'CRD'),

    BankingTotal=(SELECT ISNULL(CAST(SUM(b.pValue) as numeric(12,2)),0) 
                 FROM Table2 b 
                      where MAX(a.tName)=b.pName AND b.pCode = 'CSH' or 
                      b.pCode = 'CHQ' or b.pCode = 'CRD')

FROM Table1 a

group by YEAR(a.tDate), MONTH (a.tDate), DATENAME(Month,a.tDate), 
DAY(a.tDate), a.tTillNo

order by YEAR(a.tDate), MONTH (a.tDate), DATENAME(Month,a.tDate)

任何建议或文章推荐将不胜感激。预先非常感谢。

CREATE TABLE [dbo].[Table1](
[UniqueID] [int] IDENTITY(1,1) NOT NULL,
[tTillNo] [varchar](4) NULL,
[tName] [varchar](20) NULL,
[tDate] [datetime] NULL)

INSERT INTO Table1 (tTillNo, tName, tDate)
VALUES ('0101', '01010000001', '2018-10-30 00:00:00.000'),
       ('0101', '01010000002', '2018-10-30 00:00:00.000'),
       ('0102', '01020000001', '2018-10-30 00:00:00.000'),
       ('0102', '01020000002', '2018-10-30 00:00:00.000')

CREATE TABLE [dbo].[Table2](
[UniqueID] [int] IDENTITY(1,1) NOT NULL,
[pName] [varchar](20) NULL,
[pCode] [varchar](10) NULL,
[pValue] [decimal](22, 7) NULL)


INSERT INTO Table2 (pName, pCode, pValue)
VALUES ('01010000001', 'CRD', '100.0000000'),
       ('01010000002', 'CSH', '100.0000000'),
       ('01020000001', 'CHQ', '100.0000000'),
       ('01020000002', 'CSH', '100.0000000'),
       ('01020000002', 'CRD', '100.0000000'),
       ('01010000001', 'CSH', '100.0000000')

1 个答案:

答案 0 :(得分:2)

我认为您可以通过联接解决所有问题。

select DATENAME(Month,a.tDate) as 'Month Name'
   , DAY(a.tDate) as 'Day'
   , MONTH(a.tDate) as 'Month'
   , YEAR(a.tDate) as 'Year'
   , a.tTillNo
   , BankedCash=SUM(case when pCode in( 'CSH','CHQ') then pvalue else 0 end)
   , [Card] = SUM(case when pCode in( 'CRD') then pvalue else 0 end)
   ,Total = SUM(pvalue)
from TableA a
    join TableB b on a.tName=b.pName
group by YEAR(a.tDate)
    , MONTH (a.tDate)
    , DATENAME(Month,a.tDate)
    , DAY(a.tDate)
    , a.tTillNo