SQL Server: подзапрос возвращает те же значения

#sql #sql-server #reporting-services

#sql #sql-сервер #службы отчетов

Вопрос:

Я все еще изучаю SQL, поэтому, пожалуйста, простите за вопиющие ошибки. Я придумал следующий сценарий, мне в основном нужно перечислять ежедневную информацию для каждого столбца. Возможно, я перестарался с подзапросами, поскольку они возвращают те же значения, но я понятия не имею, как это исправить. Любая подсказка будет с благодарностью принята. конечная цель — получить функциональный запрос, который я могу использовать в SSRS.

 SELECT
    CONVERT(date, d.ts) 'Date', 
    s.StoreId 'Store No.', 
    s.Description,
    h.NetTotalPrice,
    b.BudgetAmt,
    eod.BalanceAmount'Electronic Deposit', 
    h.custID'Cust Count',
    c.TotalTransactions'NumTrans',
    c.TotalSales,

    --departments subqueries  
    (SELECT TOP 1 SUM(h.NetTotalPrice) 
     FROM tblTransSalesHdr h WITH (nolock) 
     LEFT JOIN tblDept dep ON h.storeID = dep.StoreId
     WHERE dep.DeptID = 'Accessories' 
     GROUP BY h.StoreId) 'ACCESSORIES',
    (SELECT TOP 1 SUM(h.NetTotalPrice) 
     FROM tblTransSalesHdr h WITH (nolock) 
     LEFT JOIN tblDept dep ON h.storeID = dep.StoreId
     WHERE dep.DeptID = 'Books' 
     GROUP BY h.StoreId) 'BOOKS',
    (SELECT TOP 1 SUM(h.NetTotalPrice) 
     FROM tblTransSalesHdr h WITH (nolock) 
     LEFT JOIN tblDept dep ON h.storeID = dep.StoreId
     WHERE dep.DeptID = 'Electronics' OR dep.deptID = 'Electrical and mechanical' 
     GROUP BY h.StoreId) 'Eamp;M',
    (SELECT TOP 1 SUM(h.NetTotalPrice) 
     FROM tblTransSalesHdr h WITH (nolock) 
     LEFT JOIN tblDept dep ON h.storeID = dep.StoreId
     WHERE dep.DeptID = 'Furniture' 
     GROUP BY h.StoreId) 'FURNITURE',
    (SELECT TOP 1 SUM(h.NetTotalPrice) 
     FROM tblTransSalesHdr h WITH (nolock) 
     LEFT JOIN tblDept dep ON h.storeID = dep.StoreId
     WHERE dep.DeptID = 'Linen' 
     GROUP BY h.StoreId) 'LINEN',
    (SELECT TOP 1 SUM(h.NetTotalPrice) 
     FROM tblTransSalesHdr h WITH (nolock) 
     LEFT JOIN tblDept dep ON h.storeID = dep.StoreId
     WHERE dep.DeptID = 'Shoes'
     GROUP BY h.StoreId) 'SHOES',
    (SELECT TOP 1 SUM(h.NetTotalPrice) 
     FROM tblTransSalesHdr h WITH (nolock) 
     LEFT JOIN tblDept dep ON h.storeID = dep.StoreId
     WHERE dep.DeptID = 'Textiles' 
     GROUP BY h.StoreId) 'TEXTILES',
    (SELECT TOP 1 SUM(h.NetTotalPrice) 
     FROM tblTransSalesHdr h WITH (nolock) 
     LEFT JOIN tblDept dep ON h.storeID = dep.StoreId
     WHERE dep.DeptID = 'Wares' 
     GROUP BY h.StoreId) 'WARES',
    (SELECT TOP 1 SUM(h.NetTotalPrice) 
     FROM tblTransSalesHdr h WITH (nolock) 
     LEFT JOIN tblDept dep ON h.storeID = dep.StoreId
     WHERE dep.DeptID = 'Cash over/short' 
     GROUP BY h.StoreId) 'CASHOVER(SHORT)',
    (SELECT TOP 1 SUM(h.NetTotalPrice) 
     FROM tblTransSalesHdr h WITH (nolock) 
     LEFT JOIN tblDept dep ON h.storeID = dep.StoreId
     WHERE dep.DeptID = 'Found Money' 
     GROUP BY h.StoreId) 'Found Money',
    (SELECT TOP 1 SUM(h.NetTotalPrice) 
     FROM tblTransSalesHdr h WITH (nolock) 
     LEFT JOIN tblDept dep ON h.storeID = dep.StoreId
     WHERE dep.DeptID = 'Gift Card Purchased' 
     GROUP BY h.StoreId) 'Purchased GiftCard',
    (SELECT TOP 1 SUM(h.NetTotalPrice) 
     FROM tblTransSalesHdr h WITH (nolock) 
     LEFT JOIN tblDept dep ON h.storeID = dep.StoreId
     WHERE dep.DeptID = 'Gift Card Redeemed' 
     GROUP BY h.StoreId) 'Redeemed GiftCard',

    --Discounts Subqueries 
    (SELECT TOP 1 SUM(h.NetTotalPrice) 
     FROM tblTransSalesHdr h WITH (nolock) 
     INNER JOIN tblTransSalesPmt pmt WITH (nolock) ON pmt.storeID = h.storeID
     WHERE pmt.PmtMethodId = 'Mission

вывод выглядит следующим образом:
введите описание изображения здесь


Комментарии:

1. пожалуйста, предоставьте образцы данных и желаемый результат

2. Поскольку вы обращаетесь к tblTransSalesHdr так много раз, вероятно, намного быстрее использовать PIVOT. Не базовый SQL, но его стоит использовать в таком случае, как ваш.

3. Прекратите разбрызгивать свой код с помощью nolock .

4. В связи с комментарием @Smor, вредные привычки: везде ставить NOLOCK

5. И вы хотите присоединиться tblTransSalesHdr к либо PIVOT или условной агрегации SUM(CASE WHEN dep.DeptID = 'Gift Card Redeemed'...

GROUP BY h.StoreId) 'Vouchers Moneyвывод выглядит следующим образом:
введите описание изображения здесь

Комментарии:

1. пожалуйста, предоставьте образцы данных и желаемый результат

2. Поскольку вы обращаетесь к tblTransSalesHdr так много раз, вероятно, намного быстрее использовать PIVOT. Не базовый SQL, но его стоит использовать в таком случае, как ваш.

3. Прекратите разбрызгивать свой код с помощью nolock .

4. В связи с комментарием @Smor, вредные привычки: везде ставить NOLOCK

5. И вы хотите присоединиться tblTransSalesHdr к либо PIVOT или условной агрегации SUM(CASE WHEN dep.DeptID = 'Gift Card Redeemed'...

,
(SELECT TOP 1 SUM(d.TotalDiscount)
FROM tblTransSalesDtl d WITH (nolock)
LEFT JOIN tblTransSalesLineDiscount ld WITH (nolock) ON d.StoreId = ld.StoreId AND d.TransId = ld.TransId
WHERE ld.DiscountType = 'COTW'
GROUP BY CONVERT(date, d.ts)) 'Color Disc',
(SELECT TOP 1 SUM(d.TotalDiscount)
FROM tblTransSalesDtl d WITH (nolock)
LEFT JOIN tblTransSalesLineDiscount ld WITH (nolock) ON d.StoreId = ld.StoreId AND d.TransId = ld.TransId
WHERE ld.DiscountType = 'PROMO-Employee'
GROUP BY CONVERT(date, d.ts)) 'Employee Disc',
(SELECT TOP 1 SUM(d.TotalDiscount)
FROM tblTransSalesDtl d WITH (nolock)
LEFT JOIN tblTransSalesLineDiscount ld WITH (nolock) ON d.StoreId = ld.StoreId AND d.TransId = ld.TransId
WHERE ld.DiscountType = 'PROMO-99 Sunday'
GROUP BY CONVERT(date, d.ts)) 'Sunday Disc'
FROM
tblTransSalesHdr h WITH (nolock)
INNER JOIN
tblTransSalesDtl d WITH (nolock) ON h.TransId = d.TransId
AND h.StoreId = d.StoreId
INNER JOIN
tblRptSalesByCategory c WITH (nolock) ON c.StoreId = d.StoreId
INNER JOIN
tblEODDrawerTotal eod WITH (nolock) ON eod.StoreId =c.StoreId
INNER JOIN
tblStore s WITH (nolock) ON eod.StoreId = s.StoreId
INNER JOIN
tbldept dep WITH (nolock) ON dep.StoreId = s.StoreId
LEFT JOIN
tblBudgetDaily b WITH (nolock) ON dep.StoreId = b.StoreId
AND dep.DeptId = b.DeptID
WHERE
Status = 3
вывод выглядит следующим образом:
введите описание изображения здесь

Комментарии:

1. пожалуйста, предоставьте образцы данных и желаемый результат

2. Поскольку вы обращаетесь к tblTransSalesHdr так много раз, вероятно, намного быстрее использовать PIVOT. Не базовый SQL, но его стоит использовать в таком случае, как ваш.

3. Прекратите разбрызгивать свой код с помощью nolock .

4. В связи с комментарием @Smor, вредные привычки: везде ставить NOLOCK

5. И вы хотите присоединиться tblTransSalesHdr к либо PIVOT или условной агрегации SUM(CASE WHEN dep.DeptID = 'Gift Card Redeemed'...