Я уже делал то же самое, используя подзапросы. Поэтому, если ваша оригинальная таблица была вызвана StoreCountsByWeek, и у вас была отдельная таблица, в которой перечислены идентификаторы магазина, то она будет выглядеть так:
SELECT StoreID,
Week1=(SELECT ISNULL(SUM(xCount),0) FROM StoreCountsByWeek WHERE StoreCountsByWeek.StoreID=Store.StoreID AND Week=1),
Week2=(SELECT ISNULL(SUM(xCount),0) FROM StoreCountsByWeek WHERE StoreCountsByWeek.StoreID=Store.StoreID AND Week=2),
Week3=(SELECT ISNULL(SUM(xCount),0) FROM StoreCountsByWeek WHERE StoreCountsByWeek.StoreID=Store.StoreID AND Week=3)
FROM Store
ORDER BY StoreID
. Одно из преимуществ этого метода заключается в том, что синтаксис более понятен и это упрощает присоединение к другим таблицам, чтобы вывести другие поля в результаты.
Мои анонимные результаты заключаются в том, что выполнение этого запроса по нескольким тысячам строк завершено менее чем за одну секунду, и я на самом деле имеет 7 подзапросов. Но, как отмечается в комментариях, сделать это так дорого, поэтому будьте осторожны при использовании этого метода, если вы ожидаете, что он будет работать на больших объемах данных.
Вы не должны возвращать компоненты из методов жизненного цикла. Установите данные API, выбранные в локальном состоянии, а затем передайте их компоненту в функции рендеринга.
componentDidMount() {
const db = firebase.firestore();
db.collection("posts")
...
.then(querySnapshot => {
this.setState({ data: querySnapshot })
})
...
}
render() {
return <MyNotes data={this.state.data} />;
}
class HandleMyNotes extends Component {
state = {
isLoading: false,
err: null,
posts: [],
};
componentDidMount() {
const db = firebase.firestore();
this.setState({
isLoading: true,
});
db.collection("posts")
.where("author.email", "==", this.props.authorEmail)
.get()
.then(querySnapshot => {
this.setState({
isLoading: false,
posts: querySnapshot.map(note => note.data()),
});
})
.catch(err => {
this.setState({
isLoading: false,
err,
});
});
}
render() {
const {
isLoading,
err,
notes,
} = this.state;
// if loading or error you can handle here.
return (
<div>
{notes.map(note => <Note key={note.id} data={note}/>)}
</div>
);
}
}