ВЫБЕРИТЕ, используя коррелированные подзапросы и несколько таблиц - PullRequest
0 голосов
/ 30 октября 2018

У меня есть две таблицы (Таблица1 и Таблица2). Один, включающий столбец даты (tDate) и столбец идентификатора (tTillNo), по которому я хотел бы сгруппировать. И еще со значениями (pValue), которые я хотел бы суммировать для каждой даты и идентификатора.

Таблицы могут быть объединены с использованием столбцов 'tName' и 'pName' из каждой таблицы, однако столбец pName может иметь дубликаты, которые я хотел бы включить в сумму. Для 3 подзапросов мне также нужно включить предложения where, используя столбец «pCode».

И я хотел бы вернуть столбцы, показанные здесь 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 голосов
/ 30 октября 2018

Я думаю, что вы можете решить все это с помощью объединения.

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
...