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